1. What is My SQL ?
What is My SQL ?
# ENTAZ
# DB팀 이영훈
2. What is My SQL ?
02 트랜잭션 & 잠금
# 트랜잭션?
# MYSQL 격리 수준
# 트랜잭션 구현
# INNODB 엔진
# MYSQL 잠금
# 스토리지엔진 잠금
3. What is My SQL ?
트랜잭션?
# 거래를 의미
유재석이 하하에게 2000원을 입금 한다고 가정해보자
name
잔고
name
잔고
유재석
2000
하하
1000
1. 유재석 잔고 -2000
2. 하하 잔고 +2000
4. What is My SQL ?
ACID
# 원자성(Atomicity)
all or noting
# 일관성(Consistency)
트랜잭션 후 일관성 있는 데이터베이스 상태를 유지 해야함
# 고립성(Isolation)
트랜잭션을 수행 시 다른 트랜잭션의
연산 작업에 영향을 미치면 안됨
# 지속성(Durability)
성공적으로 수행된 트랜잭션은 영원히 반영되어야 함
5. What is My SQL ?
일관성(Consistency)
트랜잭션 후 일관성 있는 데이터베이스 상태를 유지 해야함
6. What is My SQL ?
ACID
# 원자성(Atomicity)
all or noting
# 일관성(Consistency)
트랜잭션 후 일관성 있는 데이터베이스 상태를 유지 해야함
# 고립성(Isolation)
트랜잭션을 수행 시 다른 트랜잭션의
연산 작업에 영향을 미치면 안됨
# 지속성(Durability)
성공적으로 수행된 트랜잭션은 영원히 반영되어야 함
7. What is My SQL ?
고립성(Isolation)
트랜잭션을 수행 시 다른 트랜잭션의
연산 작업에 영향을 미치면 안됨
name
잔고
name
잔고
name
잔고
유재석
2000
하하
1000
박명수
1000
1번 트랜잭션
1. 유재석 잔고 -2000
2. 하하 잔고 +1000
2번 트랜잭션
1. 박명수 잔고 -1000
2. 하하 잔고 +1000
8. What is My SQL ?
ACID
# 원자성(Atomicity)
all or noting
# 일관성(Consistency)
트랜잭션 후 일관성 있는 데이터베이스 상태를 유지 해야함
# 고립성(Isolation)
트랜잭션을 수행 시 다른 트랜잭션의
연산 작업에 영향을 미치면 안됨
# 지속성(Durability)
성공적으로 수행된 트랜잭션은 영원히 반영되어야 함
9. What is My SQL ?
지속성(Durability)
성공적으로 수행된 트랜잭션은 영원히 반영되어야 함
name
잔고
name
잔고
유재석
2000
하하
1000
1. 유재석 잔고 -2000
2. 하하 잔고 +2000
근대 컴퓨터는 모든 연산을 일단 메모리에 적습니다.
메모리의 정보를 하드로 내리죠
10. What is My SQL ?
ACID
# 원자성(Atomicity)
all or noting
# 일관성(Consistency)
트랜잭션 후 일관성 있는 데이터베이스 상태를 유지 해야함
# 고립성(Isolation)
트랜잭션을 수행 시 다른 트랜잭션의
연산 작업에 영향을 미치면 안됨
# 지속성(Durability)
성공적으로 수행된 트랜잭션은 영원히 반영되어야 함
11. What is My SQL ?
트랜잭션의 구현
# 원자성(Atomicity)
# 일관성(Consistency)
현재 데이터
변경 후 데이터
변경전 데이터
name
잔고
name
잔고
name
잔고
유재석
2000
유재석
0
유재석
2000
name
잔고
name
잔고
하하
1000
하하
1000
유재석이 하하에게 2000원을 입금 한다고 가정해보자
1. 유재석 잔고 -2000
에러 발생!
2. 하하 잔고 +2000
12. What is My SQL ?
트랜잭션의 구현
# 고립성(Isolation)
하하 를 변경하기 전에 락을 걸면 됩니다.
락이 걸리면 그락이 풀리기 전까지는 누구도 접근을 못하니까요
# 지속성(Durability)
하드 디스크에 파일이 적힌 다음에 성공을 리턴하면 됩니다.
13. What is My SQL ?
MYSQL 잠금
락? 동시성 일때 정합성을 유지 하기 위해 사용
LOCK = table.getLock()
if(LOCK.lock()){
//do something with table
LOCK.unLock();
wakeup();
}else{
sleep();
};
14. What is My SQL ?
TABLE LOCK
# READ LOCK(SHARED LOCK, 공유락)
읽기 전용 락입니다.
# WRITE LOCK(EXCLUSIVE LOCK, 배타락)
쓰기 전용 락입니다.
U1:READ
U2:WRITE
TABLE
U3:READ
U4:READ
U5:READ
15. What is My SQL ?
# Storage engine lock
MyIsam
ROCK
InnoDB
ROCK
2.ROW
3.ROW
4.ROW
5.ROW
6.ROW
16. What is My SQL ?
MYSQL 잠금
# GLOBAL LOCK
MY SQL 서버 전체에 락을건다.
# TABLE LOCK
테이블 단위로 락을 건다
# USER ROCK
문자열에 락을 걸 수 있다
# NAME LOCK
RENAME TABLE rank TO rank_backup, rank_new TO rank;
17. What is My SQL ?
트랜잭션 격리 수준
# 고립성(Isolation)
트랜잭션을 수행 시 다른 트랜잭션의
연산 작업에 영향을 미치면 안됨
# Isolation level
트랜잭션 끼리 서로 얼마 만큼의 영향을 줘도 되는가?
18. What is My SQL ?
고립성 레벨(Isolation Level)
1. sersializable
4
repeatable read
3
read commiteed
2
read uncommitted 1
name
잔고
name
잔고
name
잔고
유재석
2000
하하
1000
박명수
1000
1번 트랜잭션
1. 유재석 잔고 -2000
2. 하하 잔고 +1000
2번 트랜잭션
1. 박명수 잔고 -1000
2. 하하 잔고 +1000
19. What is My SQL ?
고립성 레벨(Isolation Level)
1. read uncommitted 1
name
잔고
name
잔고
유재석
2000
하하
1000
1번 트랜잭션
1.start tran
2. 유재석 잔고 -2000
3. 하하 잔고 +2000
8. 에러!
9. commit
2번 트랜잭션
0. 1000
3. 2000
4.start tran
5.하하 잔고 읽기 2000
6.먼가함
7.commit;
9.1000
커밋 되지 않은 데이터를 읽는다 Dirty read!
20. What is My SQL ?
고립성 레벨(Isolation Level)
2. read committed 2
name
잔고
유재석
2000
1번 트랜잭션
1.start tran
2. 유재석 잔고 -2000
3. 하하 잔고 +2000
name
잔고
하하
1000
테이블
0. 1000
3. 3000
7. 3000
7. commit
UNDO
1000
2번 트랜잭션
4.start tran
5.하하 잔고 읽기 1000
6.먼가함
8. 다시 하하 잔고 읽기 3000
??????
트랜잭션 안에서 참조했던 값이 변경된다!
NON-REPATAIBLE READ!
21. What is My SQL ?
고립성 레벨(Isolation Level)
3. REPEATABLE-READ 3
name
잔고
유재석
2000
1번 트랜잭션 T1
1.start tran
2. 유재석 잔고 -2000
3. 하하 잔고 +2000
name
잔고
하하
1000
테이블
1000
T1: 3000 T1:1000
T1: 3000
7. commit
UNDO
2번 트랜잭션 T2
4.start tran
5.하하 잔고 읽기 1000
6.먼가함
8. 다시 하하 잔고 읽기 1000
??????
22. What is My SQL ?
고립성 레벨(Isolation Level)
PHANTOM READ
1번 트랜잭션 T1
1.start tran
2.SELECT id FROM
T1 WHERE id > 2 FOR UPDATE
= 3,5
3.먼가 처리
5.SELECT id FROM
T1 WHERE id > 2 FOR UPDATE
= 3,5,6
????
T1
id
1
3
5
2번 트랜잭션 T2
4.INSERT INTO T VALUE(6);
id
1
3
5
6
23. What is My SQL ?
Isolation level
# 저희 회사에서는 reapetable read 를 사용하고 있습니다.
즉 트랜잭션을 사용한다면 위와 같은 에러를 신경쓰지 않으셔도
됩니다.
# 만약 사용하지 않는다면?
24. What is My SQL ?
# INNODB ENGINE
InnoDB 버퍼풀
Undo 레코드
데이터페이지
버퍼
인설드버퍼
머지 쓰레드
redo
로그
메모리 영역
Insert 버퍼
write
쓰레드
기타
쓰레드
인덱스 파일
데이터 파일
로그
쓰레드
쓰레드 영역
디스크 스토리지 영역
25. What is My SQL ?
# 자주 쓰는 storage engine
InnoDB
MyISAM
Archive
트랜잭션
지원
X
X
락 레벨
로우(인덱스락)
테이블
로우
인덱스
지원
지원
X
캐쉬
데이터/인덱스
X
인덱스
파티셔닝
지원
지원
지원
클러스터 인덱스
디폴트
X
X
사용용도
OLTP
로그수집
원시로그수집
26. What is My SQL ?
Innodb Next key lock
PHANTOM READ
1번 트랜잭션 T1
1.start tran
2.SELECT id FROM
T1 WHERE id > 2 FOR UPDATE
= 3,5
3.먼가 처리
5.SELECT id FROM
T1 WHERE id > 2 FOR UPDATE
= 3,5,6
????
T1
id
1
3
5
2번 트랜잭션 T2
4.INSERT INTO T VALUE(6);
id
1
3
5
6
Integer 범위 입니다.
MIN_INT ~~~ -1, -2,1,2,3,~~~~ MAX_INT
27. What is My SQL ?
Innodb Next key lock
1번 트랜잭션 T1
1.start tran
2.SELECT id FROM
T1 WHERE id > 2
= 3,5
T1
id
1
3
5
에 거는게 아니라
2보다 큰 모든 숫자에
걸어 버리는겁니다
2.SELECT id FROM
T1 WHERE id > 3 AND id < 5
이럴경우는 3,4,5 에겁니다.
4는 없는대 락이걸렸습니다 gap lock 이라고 부름니다.
Integer 범위 입니다.
MIN_INT ~~~ -1, -2,1,2,3,~~~~ MAX_INT
Inndb next key lock
= index lock + gap lock
28. What is My SQL ?
Innodb Next key lock
T1
key_T1_id
id
name
id
1
안녕
1
2
박명수
2
3
하하
3
4
유재석
4
UPDATE T1 SET name = ‘안녕’ WHERE name = ‘안녕’
… 어떻게 될까요 ?
Innodb 는 next key lock = index lock + gap lock