아래 영상들 내용을 이해하고 정리하여 업로드 한다
Understand isolation levels & read phenomena in MySQL & PostgreSQL via examples
transaction isolation level 설명합니다! isolation이 안될 때 나타날 수 있는 여러 현상들과 snapshot isloation도 같이 설명합니다!!
트랜잭션에 Isolation을 철저하게 지킬 경우 concurrent한 처리가 힘들고, 그로 인해 처리량이 낮아진다는 단점이 존재한다. 이를 방지하기 위해 DB는 개발자가 Isolation level을 조정하여 처리량과 정확성을 적절히 조정하여 개발할 수 있도록 지원한다. Isolation Level을 조절함에 있어서 중요한 것은 낮은 Isolation Level별로 어떤 것이 제약 허용되는가와, 그로 인해 발생할 수 있는 이상 현상들이다. 이번 포스트에서는 그에 대해서 알아보겠다.
Read Phenomena
Read Phenomena 혹은 읽기 현상이란 여러 트랜잭션이 처리되면서 발생할 수 있는 이상 현상들을 말한다. 표준 SQL 92에서 정의한 Dirty read, Non-repeatable read, phantom read 현상이 여기에 포함되며, 이후 다른 논문을 통해 read skew, write skew, lost update 등의 현상이 추가적으로 보고 되었다. 자료들은 주로 SQL 표준에서 정의된 3가지를 기준으로 보통 작성되어 있는 것 같아, 이 포스트에서도 해당 현상들 위주로 전개해나가겠다.
- Dirty Read:
- 아직 커밋되지 않은 동시 트랜잭션의 쓰기 데이터를 다른 트랜잭션이 읽는 것.
- Non-repeatable Read:
- 기존의 읽은 값과 다른 트랜잭션에 의해 값이 수정되어 트랜잭션이 두 번째로 읽은 값이 달라지는 것
- isolation이라고 하는 것은 트랜잭션이 그 트랜잭션만 있는 것처럼 독립적이어야 한다는 것인데, 이에 위배됨
- Phantom Read:
- 하나가 아닌 여러 행을 검색하는 상황에서의 영향. 다른 트랜잭션의 새 행 삽입, 값 업데이트, 기존 행 삭제 등의 커밋으로 검색 조건이 변경되어 동일한 쿼리가 다른 행을 반환하는 것
- 마찬가지로 isolation에 위배
- 다른 조건이더라도 각각이 연관되어 있으면 영향을 미치기도 함
- 기타
- Read Skew:
- 한 트랜잭션이 다른 트랜잭션의 완료된 변경사항을 읽어, 결과적으로 데이터 정합성에 문제가 생긴 경우
- Dirty Write:
- 트랜잭션들의 커밋 순서가 트랜잭션들의 시작 순서와 일치하지 않으면서, 모든 트랜잭션이 성공하는 경우.
- x=10, y=10에 t1은 x+y값을 x에 t2는 x+y값을 y에 넣을 때, 두 트랜잭션이 모두 성공하면서 x=20, y=20이 되는 현상
- Write Skew:
- 서로 다른 데이터에 썼음에도 불구하고 데이터의 inconsistency가 나타난 경우
- Lost Update:
- 업데이트 된 내용을 다른 업데이트 등이 덮어씌워 처음 업데이트가 없어진 경우
- Read Skew:
Isolation Level
개발자는 Isolation level을 선택하여 위 read phenomena를 얼마나 허용하고 얼마나 막느냐를 설정할 수 있다. 각 isolation level에 대한 세부적인 구현은 데이터베이스마다 다르게 되어 있으므로, 아래에서는 대략적인 흐름만 파악하고 구체적인 것들은 따로 찾아보는 것이 더 좋다.
- Read Uncommitted
- 한 트랜잭션 내용을 커밋 여부와 상관없이 다른 트랜잭션에서 확인할 수 있음
- recoverability를 지니지 않고, abort 하지 않더라도 데이터 정합성이 깨지는 부분이 있기 때문에 대부분의 DBMS에서 이 단계를 권장하지 않거나 허용하지 않음
- Read Committed
- 다른 트랜잭션에 의해 커밋된 데이터만 볼 수 있음
- Dirty Read는 방지할 수 있으나, 한 트랜잭션이 진행 도중에 다른 트랜잭션에 의해 읽어오는 데이터가 다를 수 있으므로 Non-repeatable read 이상을 방지할 수 없음
- Repeatable Read
- 다른 동시 트랜잭션이 새로운 변경 사항을 커밋하더라도, 동일한 선택 쿼리가 동일한 결과를 반환하도록 보장
- Serializable
- Dirty Read, Non-repeatable read, Phantom read 뿐만 아니라 아예 이상한 현상 자체가 발생하지 않는 level을 의미
'Database' 카테고리의 다른 글
DB Concurrency Control - Isolation with Lock, Snapshot Isolation, MVCC (0) | 2023.10.02 |
---|---|
DB Concurrency Control - Schedule, Serializability, Recoverability (0) | 2023.09.28 |
[Postgresql, Redshift] 데이터 현황 확인하기 (0) | 2023.06.27 |
[SQL] COUNT(*), COUNT(1), COUNT(expression)의 이해 (0) | 2023.06.18 |
외부에서 MySQL DB 접속하기 (0) | 2023.02.14 |