트랜잭션 isolation 레벨 정리
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ
- SERIALIZABLE
READ UNCOMMITTED
- 각 트랜잭션에서의 변경 내용이 COMMIT이나 ROLLBACK 여부에 상관없이 다른 트랜잭션에서 보인다.
- Dirty Read(트랜잭션에서 처리한 작업이 완료되지 않았음에도 불구하고 다른 트랜잭션에서 볼 수 있게 되는 현상)가 발생한다.
ex) 사용자 A가 insert한 내용이 커밋하기 전에도 사용자 b가 조회할 수 있는 상황
READ COMMITTED
- 트랜잭션에서 데이터를 변경하더라도 커밋이 완료된 데이터만 다른 트랜잭션에서 조회 가능(Dirty Read 해결)
- NON_REPEATABLE READ(SELECT 할 때마다 다른 결과가 나오는 현상)가 발생한다.
ex) 사용자 A가 insert 한 내용은 즉시 테이블에 반영되고 이전 값은 Undo 영역으로 백업
-> 사용자 B가 조회하면 Undo 영역의 백업된 데이터를 보여준다.
-> 사용자 B가 조회할 때의 값이 사용자 A가 커밋 전과 후에 따라 값이 다르게 나온다.
REPEATABLE READ
- MySQL의 InnoDB 스토리지 엔진에서 기본적으로 사용되는 격리 수준
- 트랜잭션 번호에 따라 번호가 낮은 트랜잭션에서 변경된 내용만 볼 수 있다.(NON_REPEATABLE READ 해결)
- PHANTOM READ(하나의 트랜잭션에서 같은 SELECT 문으로 조회할 때 이전 SELECT에서는 존재하지 않던 값이 다음 SELECT에 조회되는 것) 발생
ex) SELECT ... FOR UPDATE 쿼리를 사용하면 다른 결과를 보여준다.
-> Undo 영역에는 잠금을 걸 수 없기 때문이다. (InnoDB 스토리지 엔진은 넥스트 키 락을 이용하여 PHANTOM READ 문제를 해결)
SERIALIZABLE
- 한 트랜잭션에서 읽고 쓰는 레코드는 다른 트랜잭션에서는 절대 접근 불가능
- 모든 문제가 발생하지 않지만 동시 처리가 불가능하므로 거의 사용되지 않는다.