[Database] 트랜잭션 격리수준(Transaction Isolation Level)
트랜잭션 ACID 중 I(Isolation)에 해당하는 격리성에 관한 격리 수준을 의미합니다.
병렬처리되는 트랜잭션을 완전한 격리가 아닌 격리의 수준을 지정해서 작동을 하게됩니다.
DIRTY READ, NON-REPEATABLE READ, PHANTOM READ와같이 각각 격리 단계에서 발생할 수 있는 부정합이 있습니다.
SERIALIZABLE(직렬화)
가장 엄격한 격리 수준으로 완벽한 읽기 일관성 모드 제공합니다.
한 트랜잭션에서 읽고 쓰는 레코드를 다른 트랜잭션에서는 절대 접근할 수 없습니다.
교착상태가 많이 발생하여 DB성능이 떨어집니다.
REPEATABLE READ
한 트랜잭션이 접근하는 데이터에대해 다른 트랜잭션이 수정하지 못하는 격리수준을 의미합니다.
하지만 새로운 데이터를 추가하는 INSERT문은 막지 않기때문에 같은 트랜잭션 내의 조회결과가 달라질 수 있습니다.
A 트랜잭션 시작 B트랜젝션 시작
SELECT * FROM A (조회가 되지않음)
INSERT '123'
COMMIT
SELECT * FROM A (1개가 조회)
이를 팬텀리드라고 합니다.
팬텀리드
한 트렌잭션 내에 동일한 쿼리문을 보냈을때 결과가 다른경우
(row의 갯수가 다를때)
READ_COMMITTED
커밋이 완료된 데이터만 조회가 가능합니다.
하지만 한 트랜잭션에서 접근한 데이터를 다른 트랜잭션에서 수정이 가능합니다.
- InnoDB 스토리지 엔진에서 기본적으로 사용되는 격리 수준
이로 인해 한 트랜잭션 내의 조회 결과가 달라질 수 있습니다.
A table
id=1, title = '123'
A 트랜잭션 시작 B트랜젝션 시작
SELECT * FROM A (title ='123')
update '123' -> '111'
COMMIT
SELECT * FROM A (title = '111')
이를 non-repaetable read(반복가능하지않은 조회)라고 합니다.
팬텀리드와 다른점은 팬텀리드는 row의 갯수가 변하지만 non-repeatabe read는 데이터의 정보가 바뀝니다.
READ_UNCOMMITTED
커밋이 완료되지 않은 데이터에도 조회가 가능한것을 의미합니다.
가장 격리수준이 떨어지며 DirtyREAD가 발생합니다.
DIRTY READ
아직 커밋되지않은 데이터가 조회되는것을 의미
정리
격리 수준 | DIRTY READ | NON-REPEATABLE READ | PHANTOM READ |
READ UNCOMMITTED | O | O | O |
READ COMMITTED | O | O | |
REPEATABLE READ | O(InnoDB는 발생 X) | ||
SERIALIZABLE |
- 각각 격리 수준에서는 3가지 데이터 부정합이 발생할 수 있다
- 밑으로 갈수록 동시성이 떨어지는 대신 격리성이 올라간다
- 도잇성이 떨어지나는 얘기는 속도가 저하되는것을 의미합니다
출처
https://zzang9ha.tistory.com/381
[MySQL] - 트랜잭션의 격리 수준(Isolation level)
📎 글또 6기 포스팅 1. 미치도록 더웠던 7월의 회고 2. 사용자가 게시물을 작성할 때의 트랜잭션 처리 3. Spring AOP - (1) 프록시 패턴, 데코레이터 패턴 4. [MySQL] - 트랜잭션의 격리 수준(Isolati
zzang9ha.tistory.com