트랜잭션 격리 수준이란?
여러 사용자가 동시에 같은 데이터베이스에 접근하면 데이터 정합성 문제가 발생할 수 있습니다. 트랜잭션 격리 수준(Isolation Level)은 여러 트랜잭션이 동시에 실행될 때 서로의 작업을 얼마나 볼 수 있게 허용할지를 정하는 규칙입니다. 은행 창구에 비유하면, 여러 명이 동시에 같은 계좌를 조회하고 수정할 때 서로의 작업 중간 상태를 볼 수 있게 할지, 완전히 끝난 후에만 보여줄지를 결정하는 것과 같습니다. 격리 수준이 낮을수록 성능은 좋아지지만 데이터 정합성 문제가 생길 위험이 커지고, 높을수록 안전하지만 동시성 성능이 떨어집니다.
4단계 격리 수준과 발생 가능한 문제
SQL 표준은 다음 4가지 격리 수준을 정의합니다.
READ UNCOMMITTED: 다른 트랜잭션이 아직 커밋하지 않은 데이터까지 읽을 수 있습니다. Dirty Read가 발생할 수 있습니다.READ COMMITTED: 커밋된 데이터만 읽습니다. 하지만 같은 트랜잭션 내에서 같은 쿼리를 두 번 실행하면 다른 값이 나올 수 있는 Non-Repeatable Read가 발생할 수 있습니다.REPEATABLE READ: 트랜잭션 시작 시점의 데이터를 계속 동일하게 읽도록 보장합니다. 다만 새로운 행이 추가되는 Phantom Read는 완전히 막지 못할 수 있습니다.SERIALIZABLE: 트랜잭션을 순차적으로 실행한 것과 동일한 결과를 보장합니다. 가장 안전하지만 동시성이 크게 떨어집니다.
예를 들어 계좌 잔액을 조회하는 트랜잭션 A가 실행되는 도중, 트랜잭션 B가