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