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의 동작 방식에 의해서 정의되었습니다.
- 자료 참조 : https://www.youtube.com/watch?v=bLLarZTrebU&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=17
'데이터 베이스 > RDBMS' 카테고리의 다른 글
Functional Dependency( FD )란? (0) | 2023.02.08 |
---|---|
잘못된 DB 테이블 설계로 인한 이상현상 (0) | 2023.02.08 |
RDBMS의 트랜잭션( transaction )과 ACID란? (0) | 2023.02.04 |
SQL에서 trigger란? (0) | 2023.02.04 |
stored procedure란? 그리고 장.단점 (0) | 2023.02.03 |