
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들의 기본 격리 수준은 무엇일까?