한 트랜잭션의 변경 연산 결과를 다른 트랜잭션이 덮어써 변경 연산이 무효화되는 것
T1의 X=1 → T2의 x=2 → T1 write → T2 write
한 트랜잭션이 여러 개의 데이터 변경 연산 시, 일관성 없는 상태의 DB에서 데이터를 가져와 연산 → 모순된 결과 발생
어떤 연산은 현재의 트랜잭션 실행 전 버전의 데이터, 어떤 연산은 다른 트랜잭션 실행 후 버전의 데이터를 가져오면 모순
트랜잭션 완료 전에 장애가 발생하여 rollback 연산 수행 시, 해당 트랜잭션 장애 발생 전에 변경한 데이터를 가져가 변경 연산을 실행한 다른 트랜잭션에도 rollback 연산을 연쇄적으로 실행해야 함
장애가 난 트랜잭션이 rollback 실행하기 전, 다른 트랜잭션이 commit하면 rollback 연산을 할 수 없어 문제가 발생
여러 트랜잭션이 동시에 실행되더라도 정확한 결과를 얻는 직렬 가능성을 보장함
모든 트랜잭션이 따르면 직렬 가능성이 보장되는 규약 정의
→ 트랜잭션 스케줄이 직렬 가능한지 검사할 필요x
동일한 데이터에 동시에 접근하지 못하도록 lock과 unlock 연산 이용
record lock + gap lock
MySQL에서는 REPEATABLE READ 격리 수준을 사용
InnoDB의 gap lock과 next key lock은 레플리카 서버 실행 결과와 소스 서버 실행 결과가 동일함을 보장