28
# ENTAZ # DB팀 이영훈 What is My SQL ? What is My SQL ?

2 mysql트랜잭션과잠금 v0

Embed Size (px)

DESCRIPTION

mysql

Citation preview

Page 1: 2 mysql트랜잭션과잠금 v0

# ENTAZ# DB팀 이영훈

What is My SQL ?

What is My SQL ?

Page 2: 2 mysql트랜잭션과잠금 v0

02 트랜잭션 & 잠금

# 트랜잭션?# MYSQL 격리 수준# 트랜잭션 구현# INNODB 엔진# MYSQL 잠금# 스토리지엔진 잠금

What is My SQL ?

Page 3: 2 mysql트랜잭션과잠금 v0

트랜잭션?

# 거래를 의미 유재석이 하하에게 2000원을 입금 한다고 가정해보자

What is My SQL ?

name 잔고

하하 1000name 잔고

유재석 2000

1. 유재석 잔고 -2000 2. 하하 잔고 +2000

Page 4: 2 mysql트랜잭션과잠금 v0

ACID

# 원자성(Atomicity) all or noting

# 일관성(Consistency) 트랜잭션 후 일관성 있는 데이터베이스 상태를 유지 해야함

# 고립성(Isolation) 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업에 영향을 미치면 안됨

# 지속성(Durability) 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함

What is My SQL ?

Page 5: 2 mysql트랜잭션과잠금 v0

일관성(Consistency)

트랜잭션 후 일관성 있는 데이터베이스 상태를 유지 해야함

What is My SQL ?

Page 6: 2 mysql트랜잭션과잠금 v0

ACID

# 원자성(Atomicity) all or noting

# 일관성(Consistency) 트랜잭션 후 일관성 있는 데이터베이스 상태를 유지 해야함

# 고립성(Isolation) 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업에 영향을 미치면 안됨

# 지속성(Durability) 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함

What is My SQL ?

Page 7: 2 mysql트랜잭션과잠금 v0

고립성(Isolation)

트랜잭션을 수행 시 다른 트랜잭션의 연산 작업에 영향을 미치면 안됨

What is My SQL ?

name 잔고

하하 1000

name 잔고

유재석 2000

1번 트랜잭션1. 유재석 잔고 -2000 2. 하하 잔고 +1000

2번 트랜잭션1. 박명수 잔고 -1000 2. 하하 잔고 +1000

name 잔고

박명수 1000

Page 8: 2 mysql트랜잭션과잠금 v0

ACID

# 원자성(Atomicity) all or noting

# 일관성(Consistency) 트랜잭션 후 일관성 있는 데이터베이스 상태를 유지 해야함

# 고립성(Isolation) 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업에 영향을 미치면 안됨

# 지속성(Durability) 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함

What is My SQL ?

Page 9: 2 mysql트랜잭션과잠금 v0

지속성(Durability)

성공적으로 수행된 트랜잭션은 영원히 반영되어야 함

What is My SQL ?

name 잔고

하하 1000name 잔고

유재석 2000

1. 유재석 잔고 -2000 2. 하하 잔고 +2000

근대 컴퓨터는 모든 연산을 일단 메모리에 적습니다.메모리의 정보를 하드로 내리죠

Page 10: 2 mysql트랜잭션과잠금 v0

ACID

# 원자성(Atomicity) all or noting

# 일관성(Consistency) 트랜잭션 후 일관성 있는 데이터베이스 상태를 유지 해야함

# 고립성(Isolation) 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업에 영향을 미치면 안됨

# 지속성(Durability) 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함

What is My SQL ?

Page 11: 2 mysql트랜잭션과잠금 v0

트랜잭션의 구현

# 원자성(Atomicity)# 일관성(Consistency)

What is My SQL ?

현재 데이터

name 잔고

하하 1000

name 잔고

유재석 2000

변경전 데이터

name 잔고

유재석 2000

변경 후 데이터

name 잔고

하하 1000

name 잔고

유재석 0

유재석이 하하에게 2000원을 입금 한다고 가정해보자

1. 유재석 잔고 -2000에러 발생! 2. 하하 잔고 +2000

Page 12: 2 mysql트랜잭션과잠금 v0

트랜잭션의 구현

# 고립성(Isolation)하하 를 변경하기 전에 락을 걸면 됩니다.락이 걸리면 그락이 풀리기 전까지는 누구도 접근을 못하니까요

# 지속성(Durability)하드 디스크에 파일이 적힌 다음에 성공을 리턴하면 됩니다.

What is My SQL ?

Page 13: 2 mysql트랜잭션과잠금 v0

MYSQL 잠금

락? 동시성 일때 정합성을 유지 하기 위해 사용

LOCK = table.getLock()

if(LOCK.lock()){//do something with table

LOCK.unLock();wakeup();

}else{sleep();

};

What is My SQL ?

Page 14: 2 mysql트랜잭션과잠금 v0

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

Page 15: 2 mysql트랜잭션과잠금 v0

# Storage engine lockWhat is My SQL ?

ROCK

MyIsam

ROCK2.ROW 3.ROW 4.ROW 5.ROW 6.ROW

InnoDB

Page 16: 2 mysql트랜잭션과잠금 v0

MYSQL 잠금

# GLOBAL LOCKMY SQL 서버 전체에 락을건다.

# TABLE LOCK테이블 단위로 락을 건다

# USER ROCK문자열에 락을 걸 수 있다

# NAME LOCKRENAME TABLE rank TO rank_backup, rank_new TO rank;

What is My SQL ?

Page 17: 2 mysql트랜잭션과잠금 v0

트랜잭션 격리 수준

What is My SQL ?

# 고립성(Isolation) 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업에 영향을 미치면 안됨

# Isolation level트랜잭션 끼리 서로 얼마 만큼의 영향을 줘도 되는가?

Page 18: 2 mysql트랜잭션과잠금 v0

고립성 레벨(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

Page 19: 2 mysql트랜잭션과잠금 v0

고립성 레벨(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!

Page 20: 2 mysql트랜잭션과잠금 v0

고립성 레벨(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

Page 21: 2 mysql트랜잭션과잠금 v0

고립성 레벨(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

Page 22: 2 mysql트랜잭션과잠금 v0

고립성 레벨(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

Page 23: 2 mysql트랜잭션과잠금 v0

Isolation level

What is My SQL ?

# 저희 회사에서는 reapetable read 를 사용하고 있습니다.즉 트랜잭션을 사용한다면 위와 같은 에러를 신경쓰지 않으셔도됩니다.

# 만약 사용하지 않는다면?

Page 24: 2 mysql트랜잭션과잠금 v0

# INNODB ENGINEWhat is My SQL ?

Undo 레코드

인설드버퍼머지 쓰레드

write 쓰레드

기타쓰레드

로그쓰레드

데이터 파일

인덱스 파일

데이터페이지버퍼

Insert 버퍼

redo로그

메모리 영역

쓰레드 영역

디스크 스토리지 영역

InnoDB 버퍼풀

Page 25: 2 mysql트랜잭션과잠금 v0

# 자주 쓰는 storage engineWhat is My SQL ?

InnoDB MyISAM Archive

트랜잭션 지원 X X

락 레벨 로우(인덱스락) 테이블 로우

인덱스 지원 지원 X

캐쉬 데이터/인덱스 X 인덱스

파티셔닝 지원 지원 지원

클러스터 인덱스 디폴트 X X

사용용도 OLTP 로그수집 원시로그수집

Page 26: 2 mysql트랜잭션과잠금 v0

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

Page 27: 2 mysql트랜잭션과잠금 v0

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

Page 28: 2 mysql트랜잭션과잠금 v0

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