DB 트랜잭션 격리 수준(Transaction isolation level)에 따른 동시성 이슈
가장 낮은 isolation 레벨 0의 경우 lock이 걸리지 않기때문에 속도는 매우 빠르나 동시 접근을 허용하기때문에 데이터 정합성에 문제가 생길 수 있고,
레벨3의 경우 완전히 lock을 걸어 동시 접근을 차단하고 순차적으로 처리 (serializable) 하기 때문에 정합성은 완벽하지만 동시에 처리 할 수 있는 양이 적어 속도가 매우 느리다.
Isolation Level | Dirty Read | Nonrepeatable Read | Phantom Read |
레벨0 Read Uncommited | 발생 | 발생 | 발생 |
레벨1 Read Committed | X | 발생 | 발생 |
레벨2 Repeatable Read | X | X | 발생 |
레벨3 Serializable | X | X | X |
트랜잭션 레벨 확인
SHOW VARIABLES LIKE '%transaction_isolation%';
Dirty Read ( Read Uncommited )
- 세션1에서 A테이블을 insert 한 후 commit 하지도 않았는데, 세션 2에서 조회하는 상황 가정
- 세션 1가 해당 변경사항을 commit 하지도 않았는데, A테이블을 delete 한 후 commit 하지도 않았는데 세션 2에서 조회하면 해당 변경사항을 읽어 들일 수 있게 됨
session1 트랜잭션레벨 설정 READ-UNCOMMITTED |
session2 트랜잭션레벨 설정 READ-UNCOMMITTED |
데이터 적재 |
|
데이터 조회 |
|
데이터 삭제 |
|
데이터 조회 |
Non-Repeatable Read ( Read Committed )
- 일반적인 RDBMS 에서 지원하는 트랜잭션 레벨입니다.
- 트랜잭션을 수행한 세션이 커밋할 때까지, 다른 세션에서는 변경한 내용을 조회하거나 같은 레코드를 변경할 수 없습니다.
- Unrepeatable Read 가 발생할 수 있습니다.
session1 트랜잭션레벨 설정 READ-COMMITTED |
session2 트랜잭션레벨 설정 READ-COMMITTED |
데이터적재 |
|
데이터조회 (결과 없음) |
|
commit 수행 |
|
데이터조회 (결과 있음) |
Phantom Read ( Repeatable Read )
- 트랜잭션 내에서 다른 트랜잭션이 데이터를 변경 및 커밋했더라도, 트랜잭션 시작 시점의 데이터를 보여주는 트랜젝션 레벨입니다.
- repeatable Read 에서는 데이터의 변경, 삭제, 추가 작업이 가능합니다.
- 추가가 가능하기 때문에, 트랜잭션 시작 후, 반복적인 조회작업에서 다른 트랜잭션에서 데이터가 추가되는 경우, 조회 시 데이터가 일치하지 않는 문제가 발생하는 한 현상을 말합니다.
- 반면 Phantom Read 는 데이터 변경, 삭제는 불가능 하지만 데이터 추가는 가능합니다.
session1 트랜잭션레벨 설정 REPEATABLE-READ |
session2 트랜잭션레벨 설정 REPEATABLE-READ |
데이터조회 |
|
데이터 적재 |
|
commit 수행 |
|
데이터 조회 |
참고 사항
위에 명시된 동시성 이슈가 발생하지 않는다고해서 해당 트랜잭션 격리 수준을 만족시키는 것은 아니다.
반대로 동시성 이슈가 발생하면 해당 트랜잭션 격리수준을 만족 시키지 못한다.
– 예) Repeatable Read 레벨에서 Phantom Read가 발생하지 않는다고 무조건 Serializable 레벨이 될 수 있는 것은 아니다.
– 예) Phantom Read가 발생한다면, 해당 트랜잭션 격리 수준은 Serializable 레벨이 될 수 없다.
출처
https://www.letmecompile.com/mysql-innodb-transaction-model/
'Mysql & Maria > admin' 카테고리의 다른 글
CentOS 7 Maria 10.3 환경구축 (0) | 2024.01.31 |
---|---|
Mysql xtrabackup 백업 및 복구 (slave 서버 재구성) (0) | 2024.01.11 |
root 비밀 번호 분실시 (0) | 2023.11.28 |
Mysql lock 종류 (0) | 2023.11.26 |
mysql lock 발생 테스트 (1) | 2023.11.26 |