유튜브에 정리가 잘된 영상이라 생각해서 시청후 블로그 포스팅을 하고자 합니다.
Transaction
- DB의 상태를 변환 시키는 하나의 논리적 기능을 수행하기 위한 작업 단위
- 트랜잭션은 데이터의 정합성을 보장하기 위힌 기능입니다.
- 데이터의 일관성을 유지하면서 안정적으로 데이터를 복구하기 위함.
Transaciton 특징
원자성(Atomicity)
- 트랜잭션과 관련된 작업들이 부분적으로 실행되디가 중단되지 않는것을 보장하는 능력.
- 트랜잭션이 DB에 모두 반영되거나 전혀 반영되지 않거나이다. All Or Nothing을 의미한다.
일관성(Consistency)
- 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 합니다.
- 만약 무결성 제약 조건을 항상 만족해야 한다.
- 데이터 무결성은 데이터의 정확성, 일관성, 유효성이 유지되는 것을 의미합니다.
독립성, 격리성(isolation)
- 트랜잭션을 수행 시 다른 트랜잭션의 연산작업이 끼어들지 못하도록 보장하는 것을 의미한다.
지속성(Durability)
- 성공적으로 수행 된 트랜잭션은 영원히 반영되어야 함을 의미한다.
- 중간에 시스템에 문제가 발생해도 DB 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야 한다.
Transaction이 동시에 실행 될때 발생 가능한 현상들
Dirty Read
- 트랜잭션1번이 동작 중, 트랜잭션2번이 동작되고 커밋이 안되고 롤백이 되었을 때이 커밋이 되지 않은 바뀐 데이터를 읽어 들였을때 발생하는 현상입니다.
- 아직 커밋(Commit)되지 않은 다른 트랜잭션의 데이터를 읽는 것을 의미합니다.
Non-repeatable read, Fuzzy read
- 트랜잭션1번이 동작 되었을 때, 트랜잭션2번이 반영된 데이터를 가져와서 10이 아닌 50을 가져 왔습니다.
- Isolation 관점에서 보면 여러 트랜잭션이 동시에 실행 되도 각각의 트랜잭션이 마치 혼자서 실행되는 것처럼 동작해야 한다는 점이랑 다르게 이상한 현상이다.
- 다른 트랜잭션이 커밋(Commit)한 데이터를 읽을 수 있는 것을 의미합니다.
즉, 한 트랜잭션에서 같은 쿼리로 2번이상 조회했을 때 그 결과가 상이한 상황을 말한다.
보통 데이터의 수정/삭제가 발생했을 경우 발생합니다.
Phantom read
- 트랜잭션이1번이 동작되고, 트랜잭션2번이 커밋된 데이터를 가져와서 같은 조건으로 데이터를 읽었는데 다른 데이터 결과를 가져왔습니다.
- 이 또한 Isolaton 관점에서 이상한 현상이다.
- 다른 트랜잭션이 커밋(Commit)한 데이터가 있더라도 자신의 트랜잭션에서 읽었던 내용만 사용하는 것을 의미합니다.
즉, 한 트랜잭션에서 같은 쿼리를 2번이상 조회했을 때 없던 결과가 조회되는 상황을 말합니다.
보통 데이터의 삽입이 발생했을 경우 발생합니다.
문제점
이런 이상한 현상들이 모두 발생하지 않게 만들 수 있지만, 제약사항이 많아져서 처리가능한 트랙잭션 수가 줄어들어 DB 전체 처리량이 하락하게 된다.
대안
일부이상한 현상은 허용하는 몇가지 level을 만들어서 사용자가 필요에 따라서 적절하게 선택할 수 있도록 하자
Sql 표준 isolation level
- 동시에 여러 트랜잭션이 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것.
- 세 가지 이상 현상을 정의하고 어떤 현상을 허용하는지에 따라서 각각의 isolation level이 구분된다.
isolation level 비판
- 세 가지 이상 현상의 정의가 모호하다.
- 이상 현상은 세 가지 외에도 있다.
- 상업적인 DBMS에서 사용하는 방법을 반영해서 구분하지 않았다.
추가 이상 현상
Dirty Write
- 두 개의 트랜잭션이 트랜잭션이 write할때, 만약에 rollback 을 하게 되는 경우가 발생 했을 떄 이상현상이 생기는 경우
- commit이 안된 데이터를 write를 할 때 발생
- rollback 시 정상적인 recovery는 매우 중요해서 모든 level에서 허용하면 안된다.
lost update
- 트랜잭션이 순차적으로 실행 안되고, 트랜잭션1, 2번이 겹쳐서 실행 되다 보니까 업데이트가 반영이 안된 상황이다.
Dirty read - abort 가 발생하지 않아도 발생할 수 있다.
- 커밋 되지 않은 데이터를 읽어 데이터의정합성이 깨져서 데이터의 불일치가 발생
- Dirty read 의 개념이 확장적으로 쓰여야 한다는 주장.
Read skew
- 데이터가 불일치한 읽기 현상
- Non-repeatable read 와 처럼 동작하는 현상
- 서로 다른 데이터를 썼음에도 데이터 불일치 현상
Phantom read 확장
- 같은 조건을 두번을 읽는 경우가 아니여도, 서로 연관 된 데이터가 있는 경우에는 중간에 어떤 데이터가 추가 됐을 때 이상 현상이 발생할 수 있다.
추가적인 이상 현상을 통해 기존의 표준에서 정의한 세가지 현상에서도 넓은 개념으로 확장해서 써야 한다는 주장.
Snapshot isolation
- 기존에 표준에서 정의한 level하고는 약간 다르다.
- 이상한 현상 3가지를 정의한 뒤에 얼마만큼 허용하는지에 따라 level을 구분하였는데, 컨크런시 컨트롤이 어떻게 동작할지 그 구현을 바탕으로 정의된 것.
Snapshot 트랜잭션이 시작하는 시점을 기준으로 DB 데이터를 가져온다.
실무에서의 isolation level
Mysql
- Sql 표준 isolation level 과 동일
oracle
Read Commited 그리고 Repeatable read, Serializable 모두 Serializable 로 통일하여 사용
SQL server
- Sql 표준 isolation level 기반 + Snapshot
postgreSQL
- Sql 표준 isolation level 과 동일, Serializtion Anomoaly 현상 추가
, Repeatable read 가 Snapshot isolation leve에 해당
주요 RDBMS는 SQL 표준에 기반하여 isolation level 을 정의한다.
RDBMS마다 제공하는 isolation level 다르다.
같은 이름의 isoaltion level이라도 동작방식이 다를 수 있다.
사용하는 RDBMS의 isolation level을 잘 파악해서 적절하게 사용할 수 있도록 해야한다.
참고
https://www.youtube.com/watch?v=bLLarZTrebU&t=1742s
https://zzang9ha.tistory.com/381