[SQLP]트랜잭션 Dirty Read, Non-Repeatable Read,Phantom Read/트랜잭션 격리성 수준

·2025년 2월 1일

SQLP

목록 보기
17/20

😺 Dirty Read(Uncommited Dependency)

아직 커밋되지 않은 수정 중인 데이터를 다른 트랜잭션에서 읽을 수 있도록 허용할 때 발생한다.
select sum(잔고) from 계좌;라는 문장이 Dirty Read를 허용하는 상황에서 이 문장이 수행되고 다른 트랜잭션에 계좌 잔고를 변경한다면?? 쿼리의 최종 결과 값이 비일관성 상태에 놓여서 롤백될 수 밖에 없다.

😺 Non-Repeatable Read(Inconsistent Analysis)

한 트랜잭션 내에서 같은 쿼리를 두번 실행 할 때, 그 사이에 다른 트랜잭션이 값을 수정,삭제 함으로써 두 쿼리의 결과가 상이하게 나타나는 비일관성이 발생하는 것을 말한다.

Transaction1에서 x가 처음에는 10이다. 그리고 Transaction2에서 x에 40을 더하고 commit을 했다. - Transaction 1에서 다시 x 를 읽으니 10 이 아니고 50이 나왔다. Non-Repeatable Read 때문에 데이터가 불일치 상태에 놓이는 상황이 나왔다.

😺 Phantom Read

한 트랜잭션 안에서 일정범위의 레코드들을 두번 이상 읽을 때, 첫번째 쿼리에서 없던 유령(phantom)레코드가 두번 째 쿼리에서 나타나는 현상을 말한다. 트랜잭션 도중에 새로운 레코드가 삽입되는 것을 허용하기 때문이다.

TX1에서 지역별고객과 연력대별고객을 연속해서 집계하는 도중에 새로운 고객이 TX2에서 INSERT되었다. 그 결과 두 집계 테이블을 통해 총 고객수를 카운트하면 결과 값이 서로 다른 불일치 상태에 놓이게 된다. Phantom Read현상을 방지하려면 TX1이 1번 문장을 수행하기전에 set transaction isolation level serializeble;으로 고립화 수준을 레벨 3으로 올려줘야한다. 고립화 수준을 올리면 SQL Server에서는 Lock을 통해 t2시점에 새로운 고객이 추가되는것을 막아버린다. 오라클은 Lock을 걸지 않아도 SCN과정을 통해 TX1 시점에 존재했던 고객만을 대상으로 집계를 수행하므로 동시성도 저하시키지 않고 일관성을 유지한다.

😺 트랜잭션 격리성 수준

  • Read Uncommitted : 트랜잭션에서 처리 중인 아직 커밋되지 않은 데이터를 다른 트랜잭션에서 읽는 것을 허용한다.
  • Read Committed : 트랜잭션이 커밋되어 확정된 데이터만 다른 트랜잭션이 읽도록 허용하고 Dirty Read를 방지해준다.(대부분 DBMS가 채택하고 있는 기본 트랜잭션 격리성 수준)
  • Repeatable Read : 트랜잭션내에서 쿼리를 두번 이상 수행할 때, 첫번째 쿼리에 있던 레코드가 사라지거나 값이 변경되는 현상을 방지해준다.
  • Serializable Read : 트랜잭션 내에서 쿼리를 두 번이상 수행할 때, 첫번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌지 않음은 물론 새로운 레코드가 나타나지도 않는다.
profile
냐홍

0개의 댓글