SERIALIZABLE
, REPEATABLE READ
, READ COMMITTED
, READ UNCOMMITED
가 존재한다. SELECT
작업에서도 대상 레코드에 넥스트 키 락을 읽기 잠금(공유락, Shared Lock
)을 건다.MVCC(Multi Version Concurrency Control)
방식
MySQL
에서는 트랜잭션마다 트랜잭션 ID
를 부여하여, 트랜잭션ID
보다 작은 트랜잭션 번호에서 변경한 것만 읽게 된다.RDBMS
는 변경 전의 레코드를 Undo
공간에 백업해두고 실제 레코드 값을 변경한다. Undo
에 백업된 레코드가 많아지면, 처리 성능이 떨어질 수 있다.유령 읽기(Phantom Read
)
SELECT
로 조회한 경우 트랜잭션이 끝나기 전에 다른 트랜잭션에 의해 추가된 레코드가 발견되는 현상MVCC
덕분에 일반적인 조회에서는 발생하지 않는다.MySQL
기준 , SELECT 이후 SELECT FOR UPDATE
한 경우 발생한다.COMMIT
이 완료된 데이터만 다른 트랜잭션에서 조회할 수 있다.Phantom Read
에 더해 Non-Repeatable Read(반복 읽기 불가능)
문제까지 발생한다.COMMIT
되든 ROLLBACK
되든 상관없이, 다른 트랜잭션에서 조회 할 수 있다.@Transactional(isolation=Isolation.DEFAULT)
@Transactional(isolation=Isolation.READ_COMMITTED)
DEFAULT
, READ_UNCOMMITTED
, READ_COMMITTED
, REPEATABLE_READ
, SERIALIZABLE
중 하나로 설정할 수 있다.DEFAULT
로 설정되어 있다.datastore(database)
에 기본 격리 수준을 따른다는 것을 의미한다.: 대부분의 DB
는 READ_COMMITTED
을 기본 격리수준으로 설정하고 있다.
MySQL 8.0
-> REPEATABLE_READ
Oracle DB 21c
-> READ_COMMITTED
PostgreSQL 15
-> READ_COMMITTED
MongoDB 6
-> READ_UNCOMMITTED
[DB / Spring ] @Transactional 세부 설정 - 격리 수준 / 전파 수준 설정
MySQL의 트랜잭션 격리 수준과 스프링의 @Transactional 기본 격리 수준(Isolation Level)
[MySQL] 트랜잭션의 격리 수준(Isolation Level)에 대해 쉽고 완벽하게 이해하기
트랜잭션의 격리 수준(isolation Level)이란?
트랜잭션을 사용할 때 각 DB들의 기본 격리 수준은 무엇일까?