SlideShare a Scribd company logo
What is My SQL ?

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

02 트랜잭션 & 잠금
# 트랜잭션?
# MYSQL 격리 수준
# 트랜잭션 구현
# INNODB 엔진
# MYSQL 잠금
# 스토리지엔진 잠금
What is My SQL ?

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

잔고

name

잔고

유재석

2000

하하

1000

1. 유재석 잔고 -2000
2. 하하 잔고 +2000
What is My SQL ?

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)
트랜잭션을 수행 시 다른 트랜잭션의
연산 작업에 영향을 미치면 안됨
name

잔고

name

잔고

name

잔고

유재석

2000

하하

1000

박명수

1000

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

2번 트랜잭션
1. 박명수 잔고 -1000
2. 하하 잔고 +1000
What is My SQL ?

ACID
# 원자성(Atomicity)
all or noting
# 일관성(Consistency)
트랜잭션 후 일관성 있는 데이터베이스 상태를 유지 해야함
# 고립성(Isolation)
트랜잭션을 수행 시 다른 트랜잭션의
연산 작업에 영향을 미치면 안됨
# 지속성(Durability)
성공적으로 수행된 트랜잭션은 영원히 반영되어야 함
What is My SQL ?

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

잔고

name

잔고

유재석

2000

하하

1000

1. 유재석 잔고 -2000
2. 하하 잔고 +2000
근대 컴퓨터는 모든 연산을 일단 메모리에 적습니다.
메모리의 정보를 하드로 내리죠
What is My SQL ?

ACID
# 원자성(Atomicity)
all or noting
# 일관성(Consistency)
트랜잭션 후 일관성 있는 데이터베이스 상태를 유지 해야함
# 고립성(Isolation)
트랜잭션을 수행 시 다른 트랜잭션의
연산 작업에 영향을 미치면 안됨
# 지속성(Durability)
성공적으로 수행된 트랜잭션은 영원히 반영되어야 함
What is My SQL ?

트랜잭션의 구현
# 원자성(Atomicity)
# 일관성(Consistency)
현재 데이터

변경 후 데이터

변경전 데이터

name

잔고

name

잔고

name

잔고

유재석

2000

유재석

0

유재석

2000

name

잔고

name

잔고

하하

1000

하하

1000

유재석이 하하에게 2000원을 입금 한다고 가정해보자
1. 유재석 잔고 -2000
에러 발생!
2. 하하 잔고 +2000
What is My SQL ?

트랜잭션의 구현

# 고립성(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, 배타락)
쓰기 전용 락입니다.
U1:READ
U2:WRITE
TABLE

U3:READ
U4:READ
U5:READ
What is My SQL ?

# Storage engine lock
MyIsam

ROCK

InnoDB
ROCK
2.ROW
3.ROW
4.ROW
5.ROW
6.ROW
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;
What is My SQL ?

트랜잭션 격리 수준
# 고립성(Isolation)
트랜잭션을 수행 시 다른 트랜잭션의
연산 작업에 영향을 미치면 안됨
# Isolation level
트랜잭션 끼리 서로 얼마 만큼의 영향을 줘도 되는가?
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
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!
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!
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
??????
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
What is My SQL ?

Isolation level

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

# INNODB ENGINE
InnoDB 버퍼풀
Undo 레코드
데이터페이지
버퍼

인설드버퍼
머지 쓰레드

redo
로그

메모리 영역

Insert 버퍼

write
쓰레드

기타
쓰레드

인덱스 파일
데이터 파일

로그
쓰레드

쓰레드 영역

디스크 스토리지 영역
What is My SQL ?

# 자주 쓰는 storage engine
InnoDB

MyISAM

Archive

트랜잭션

지원

X

X

락 레벨

로우(인덱스락)

테이블

로우

인덱스

지원

지원

X

캐쉬

데이터/인덱스

X

인덱스

파티셔닝

지원

지원

지원

클러스터 인덱스

디폴트

X

X

사용용도

OLTP

로그수집

원시로그수집
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
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
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

More Related Content

ODP
1 mysql아키텍쳐 v1
PDF
MySQL 상태 메시지 분석 및 활용
PDF
Zookeeper 소개
PPTX
Zoo keeper 소개
PDF
A review of zookeeper 2010.12
PDF
Intro KaKao ADT (Almighty Data Transmitter)
PDF
From MSSQL to MySQL
PDF
Let's Play with Data Safely
1 mysql아키텍쳐 v1
MySQL 상태 메시지 분석 및 활용
Zookeeper 소개
Zoo keeper 소개
A review of zookeeper 2010.12
Intro KaKao ADT (Almighty Data Transmitter)
From MSSQL to MySQL
Let's Play with Data Safely

Similar to 2 mysql트랜잭션과잠금 v0 (20)

PPTX
181215 MS SQL로 알아보는 데이터베이스
PDF
트랜잭션_인덱싱.pdf
PDF
20250228_Kit-Works Team Study_트랜잭션 격리 수준 최종 part1.pdf
PPTX
CUBRID(큐브리드) 트랜잭션 처리 원리
PPTX
파이썬 sqlite 이해하기
PDF
데이터야 안전하게 놀아보자.V.1
PDF
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
PDF
그림으로 공부하는 오라클 구조
PPT
sqlserver7.0 데이타베이스
PPTX
오라클 DB 아키텍처와 튜닝
PDF
[2015 05-29] Oracle Lock
PPTX
Transaction
PDF
All about JDBC Performance Tuning_Wh apm
PDF
Database
PPT
7.데이터수정
PPT
6.테이블만들기
DOC
Oracle History #7
PDF
NoSQL 간단한 소개
PDF
제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀
PPTX
20151024 database
181215 MS SQL로 알아보는 데이터베이스
트랜잭션_인덱싱.pdf
20250228_Kit-Works Team Study_트랜잭션 격리 수준 최종 part1.pdf
CUBRID(큐브리드) 트랜잭션 처리 원리
파이썬 sqlite 이해하기
데이터야 안전하게 놀아보자.V.1
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
그림으로 공부하는 오라클 구조
sqlserver7.0 데이타베이스
오라클 DB 아키텍처와 튜닝
[2015 05-29] Oracle Lock
Transaction
All about JDBC Performance Tuning_Wh apm
Database
7.데이터수정
6.테이블만들기
Oracle History #7
NoSQL 간단한 소개
제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀
20151024 database
Ad

2 mysql트랜잭션과잠금 v0

  • 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