Transaction Isolation Levels
Transaction Isolation Levels 란 무엇인가?
- 동시에 여러 트랜잭션이 처리될 때 각 트랜잭션이 얼마나 서로 고립되어 있는가를 나타내는 수준이다.
- 표의 아래로 내려갈수록 고립 정도가 높아지고, 성능저하가 야기 된다.
READ UNCOMMITTED (level 0) |
READ COMMITTED |
REPEATABLE READ |
SERIALIZABLE |
※ mysql innodb의 기본은 REPEATABLE READ 이다. ( The default isolation level for InnoDB is REPEATABLE READ.)
ISOLATION LEVEL 확인
쿼리
SELECT @@global.tx_isolation; |
결과
이제 각 레벨에 대해 알아보자
READ UNCOMMITTED
READ UNCOMMITTED 격리수준에서는 어떤 트랜잭션의 변경내용이 COMMIT이나 ROLLBACK과 상관없이
다른 트랜잭션에서 보여지기 때문에 Dirty Read가 발생함
READ UNCOMMITTED는 데이터 정합성에 문제가 생기는 격리 수준.
- (?) Dirty Read : 트랜잭션의 작업이 완료되지 않았는데도 다른 트랜잭션에서 해당 데이터를 읽는 현상
- (?) 데이터 정합성 : 데이터의 값이 서로 일치함
READ COMMITTED
한 트랜잭션의 변경내용이 커밋(commit) 되어야만 다른 트랜잭션에서 조회가 가능함.
Select문이 실행되는 동안 Shared lock이 걸림, 조회시에는 실제 테이블 값이 아니라 Undo 영역에
백업된 레코드값을 가져옴!
하지만 하나의 트랜잭션에서 똑같은 Select 쿼리를 실행 했을때 항상 같은 결과를 가져와야 하는 REPEATABLE READ의 정합성에 어긋남 ㅠㅠ, Non-repeatable Read이 발생한다.
- (?) Undo : 데이터베이스에서 트랜잭션의 롤백 기능을 지원하기 위해 사용되는 공간, 트랜잭션이 실행될 때, 데이터베이스는 해당 트랜잭션에서 변경된 데이터의 이전 버전을 Undo 영역에 저장한다, 이러한 이전 버전의 데이터는 트랜잭션이 롤백될 때 사용되어 데이터를 이전 상태로 복원하는 데 활용됩니당
-(?) Non-repeatable Read : 트랜잭션에서 같은 데이터를 두번이상 읽을때, 첫 번째 읽을때랑 두번째 읽을때 데이터가 변경되는 현상을 말함!
REPEATABLE READ
트랜잭션 범위 내에서 조회한 내용이 항상 동일함을 보장하는 트랜잭션 격리 수준.
트랜잭션은 고유한 번호를 가지며 undo 영역에 백업된 모든 레코드에는 변경을 발생시킨 트랜잭션의 고유 번호가 포함되어 있음, 하나의 트랜잭션 안에서 일어나는 모든 Select 쿼리는 자신의 트랜잭션 번호보다 작은 번호에서 변경한 사항만 볼 수 있음, 이러한 방식을 MVCC라고 함
# 모든 InnoDB의 트랜잭션은 고유한 트랜잭션 번호(순차적으로 증가)를 가지고 있음
# Phantom Read는 데이터베이스 트랜잭션에서 동시성 제어 문제 중 하나를 가리키는 용어, 트랜잭션이 동시에 여러행을 조회할 때 이전 쿼리에서 반환된 결과와 다른행이 반환되는 현상!
-(?) MVCC : Multi versifon concurrency control 의 약자로, 데이터베이스 시스템에서 동시성 제어를 달성하기 위한 기술중 하나다. 이 기능 덕분에 "일관된 읽기"가 가능하다.
SERILIZABLE
모든 작업을 하나의 트랜잭션에서 처리하는 것과 같이 동작하는 가장 높은 트랜잭션 격리 수준.
한 트랜잭션에서 읽고 쓰는 레코드를 다른 트랜잭션에서는 절대 접근 할 수 없음.
Phantome Read 문제는 발생하지 않지만, DeadLock에 걸릴 가능성이 존재함.
그리고 동시성 처리 성능이 저하 되기 때문에 신중하게 사용해야 함!
참고 )
17.7.2.1 Transaction Isolation Levels
[DB] Transaction Isolation Level?? 그게 뭔데?
[db] 트랜잭션 격리수준(isolation level)
+ chatGPT
'프로그래밍 > DB & Redis' 카테고리의 다른 글
[mysql] mysql 비밀번호 정책 수준 낮추고 계정 생성 (0) | 2024.10.30 |
---|---|
[C# - dapper] ExplicitKey (0) | 2024.06.05 |
[DB] 인덱스가 왜 중요한가!! (0) | 2024.03.07 |
[mysql] INFORMATION_SCHEMA 관련 정리 (0) | 2024.02.26 |
[mysql] 현재 시간, 현재시간 unixtime, 특정시간, 특정시간 unixTime 쿼리 (0) | 2024.02.16 |
댓글