SQL 표준에서 정의한 transaction 3가지 이상 현상

 

Dirty read

 

 

  • 위와 같이 다른 트랜잭션에서 수행한 Commit 되지 않는 변화를 읽은 후 해당 데이터가 다시 rollback되어 자신의 트랜잭션이 commit한 데이터에 일관성이 깨지는 이상 현상을 Dirty read라고 합니다.




Non-repeatable read( 또는 Fuzzy read )

 

 

  • 같은 데이터를 두 번 이상 읽었지만 다른 트랜잭션에 의해서 값이 달라지는 현상을 말합니다. 이처럼 다른 트랜잭션에 의해서 중간에 처리 결과가 바뀌는 현상은 isolation을 위반한 것으로 볼 수 있습니다.




Phantom read

 

 

  • 같은 조건으로 두 번 이상 읽었는데 중간의 다른 트랜잭션에 의해서 없던 데이터가 생기는 현상을 말합니다.




이상 현상 예방과 처리량( throughput )

 

  • Dirty read, Non-repeatable read, Phantom read와 같은 이상 현상들을 예방할 수 있지만, 그렇게 한다면 제약 사항이 많아져서 동시 처리 가능한 트랜잭션 수가 줄어들어 결국 DB의 전체 처리량(throughput)이 하락하게 됩니다. 그래서 isolation level을 통해서 일부 이상 현상은 허용하여 사용자가 필요에 따라서 적절하게 선택할 수 있도록 할 수 있습니다.




isolation 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

 

 

 

  • Serializable level은 위 세 가지 현상 뿐만 아니라 이상 현상 자체가 발생하지 않는 level을 의미합니다.

  • 세 가지 이상 현상을 정의하고 어떤 현상을 허용하는지에 따라서 각각의 isolation level이 구분됩니다. 그렇기 때문에 개발자는 isolation level을 통해 전체 처리량(throughput)과 데이터 일관성 사이에 어느 정도 타협을 볼 수 있습니다.




SQL 표준에서 정의한 이상 현상 외에 추가적인 이상 현상

 

  • 1995년에 SQL 표준에서 정의한 이상 현상에 대한 비판 논문이 발표되었으며 아래 3가지 비판 내용을 담고 있습니다.




SQL 표준에서 정의한 이상 현상 비판 내용

 

  • 세 가지 이상 현상의 정의가 모호한 모호하다.

 

  • 이상 현상을 세 가지 외에도 더 있다.

 

  • 상업적인 DBMS에서 사용하는 방법을 반영해서 isolation level을 구분하지 않았다.




추가적인 이상 현상

 

Dirty write

 

 

  • commit 안된 데이터에 write 하여 commit을 한 후 다른 트랜잭션에서 abort가 발생되었다면 write한 데이터가 사라지는 현상을 말합니다. 특히, rollback시 정상적인 recovery는 매우 중요하기 때문에 모든 isolation level에서는 dirty write를 허용하면 안 됩니다.




Lost update

 

 

  • commit되지 않은 데이터에 데이터를 쓴 후 다른 트랜잭션에 의해서 데이터가 덮어씌워지는 현상을 Lost update라고 합니다.




Dirty read의 추가적인 이상 사항

 

 

  • 위와 같이 데이터를 읽기만 하고 abort가 발생하지 않아도 x, y 데이터의 합이 100이 안 되는 것처럼 일관성이 깨지는 현상이 발생될 수 있습니다.




Read skew

 

 

  • 두 번째 트랜잭션은 x, y를 읽었을 뿐인데 데이터에 대한 일관성이 깨지는 현상을 Read skew라고 합니다.




Write skew

 

 

  • x + y >= 0 제약 조건이 있는데 다른 트랜잭션이 commit 하지 않은 데이터를 읽고 쓰기를 함으로써 제약 조건을 위반되는 상황을 말합니다.




Phantom read의 추가적인 이상 현상

 

 

  • 같은 조건으로 데이터를 두 번 이상 읽는것 뿐만 아니라 연관된 데이터를 각각 읽는 경우에도 Phantom read 현상이 발생될 수 있습니다.




SQL 표준의 이상 현상을 비판한 논문의 추가적인 isolation level

 

Snapshot isolation level

 

 

  • 각 트랜잭션마다 특정 시점의 스냅샷을 기준으로 operation을 수행하고 commit할 때 write write conflict가 발생했다면 먼저 commit된 트랜잭션만 인정하는 방식을 Snapshot isolation level이라고 합니다.

 

  • SQL 표준의 isolation level은 이상 현상을 정의하고 이상 현상을 얼만큼 허용하느냐에 따라서 isolation level을 구분한다면 Snapshot isolation level은 Concurrent Control의 동작 방식에 의해서 정의되었습니다.







+ Recent posts