여러 트랜잭션이 동시에 실행될 때 서로 간 영향을 주지 않도록 하는 속성
commit되지 않은 변화를 읽음
ex) 기존 데이터: x=10, y=20, 트랜잭션1: x에 y 더하기, 트랜잭션2: y를 70으로 변경
r1(x:10) → w2(y=70) → r1(y:70) → w1(x=80) → commit 1 → abort 2(rollback y=20)
트랜잭션2가 롤백되었지만, 트랜잭션1에서 트랜잭션2가 write한 데이터를 읽음
같은 데이터의 값이 달라짐
ex) 기존 데이터: x=10, 트랜잭션1: x를 두 번 읽기, 트랜잭션2: x에 40 더하기
r1(x:10) → r2(x:10) → w2(x=50) → commit 2 → r1(x:50) → commit 1
트랜잭션1이 같은 데이터를 읽었지만 서로 다른 데이터를 반환함
없던 데이터가 생김
ex) 기존 데이터: t1(...,v=10), t2(...,v=50), 트랜잭션1: v가 10인 데이터 두 번 읽기, 트랜잭션2: t2의 v를 10으로 변경
r1(v:10=>t1) → w2(t2.v=10) → commit 2 → r1(v:10=>t1,t2) → commit 1
트랜잭션1에서 원래 t1하나만 읽었지만, 트랜잭션2 수행 후 t2 데이터가 생김
위 3가지 현상이 모두 발생하지 않게 만들수 있지만, 제약사항이 많아져 동시 처리 가능한 트랜잭션 수가 줄어들어 DB 전체 처리량이 떨어지는 문제 발생
▶︎ 일부 이상한 현상 허용하는 몇 가지 level 만들어 사용자가 필요에 따라 적절히 선택 →격리성 수준
트랜잭션이 다른 트랜잭션과 어느 정도 독립적으로 실행될 것인지 결정하는 설정
❓ 격리성 수준? 직렬화?
직렬화는 모든 트랜잭션이 동시에 실행되더라도 순차적으로 실행된 것과 같은 결과를 보장하는 성질로 "이론적인 개념"
격리성 수준은 트랜잭션 간 동시 실행을 조정하여 충돌 방지하는 설정으로 "실제 구현 방법"
isolation level | Dirty read | Non-repeatable read | Phantom read |
---|---|---|---|
Read uncommitted | O | O | O |
Read committed | X | O | O |
Repeatable read | X | X | O |
Serializable | X | X | X |