트랜잭션(Transcation)?
- 데이터베이스에서 하나의 논리적 기능을 수행하기 위해 여러 개의 쿼리들을 하나로 묶는 작업의 단위.
- 원자성, 일관성, 독립성, 지속성 (ACID) 특징을 기억하자.
원자성(atomicity): "all or nothing". 하나의 트랜잭션 안의 일이 모두 수행됐거나 안됐거나를 보장하는 특징.
일관성(Consistency): 데이터를 정해진 규칙에 따라 변경하는 것.
격리성(Isolation): 트랜잭션 수행 시 서로 간에 끼어들지 못하는 것.
지속성(Durability): 성공적으로 실행된 트랜잭션은 완전히 반영되어야 함. 롤백, 시스템 복구, 저널링 등의 기능이 있어야 함을 뜻함.
DBMS의 Storage System에 속하는 모듈 중 하나로, Main Memory에 유지하는 페이지를 관리하는 모듈인 "Page Buffer의 버퍼 관리 정책"에 따라 전략이 달라짐.
Undo: 정상적으로 종료되지 않은 transaction이 변경한 page들은 원상 복구 되어야 하는데, 이 복구를 undo라고 함.
Redo: 이미 commit한 transaction의 수정을 재반영하는 복구 작업.
Read_uncommited(Lv.0): 가장 낮은 격리 수준. 트랜잭션이 커밋되기 이전에 다른 트랜잭션에 노출이 됨. 그러나 가장 빠름. 데이터 무결성을 위한다면 지양해야 하나, 많은 양의 데이터를 어림잡아 집계하는 데 사용하는 것은 추천됨.
Read_commited(Lv.1): 많은 데이터베이스의 기본값. 커밋 완료된 데이터에 대해서만 조회 허용. 그러나 수정하는 행위를 허용하기 때문에 non-repeatable read 현상이 일어날 수 있음.
Repeatable_read(Lv.2): 트랜잭션 범위 내에서 조회한 데이터 내용이 항상 동일함을 보장함. 다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정 불가능. MySQL Default 설정값.
Serializable(Lv.3): 엄격한 격리성. 완벽한 읽기 일관성 모드를 제공함.
그러나 순차적으로 진행하기 때문에 교착상태 일어날 확률 크고 성능이 떨어짐.
Dirty read: 한 트랜잭션이 실행 중일 때 다른 트랜잭션에 의해 수정되었고, 아직 커밋되지 않은 상태임에도 그 바뀐 데이터를 조회하게 되는 경우.
- 발생 Level: Read Uncommitted
Non-repeatable read: 한 트랜잭션 안에서 같은 행에 두 번 조회가 발생했는데 그 값이 다른 경우. 즉, 행의 값이 달라질 수 있다는 것이 다른 행이 선택될 수 있다는 Phantom read와 다른 점임.
- 발생 Level: Read committed, Read Uncommitted
Phantom read: 한 트랜잭션 안에서 동일한 쿼리를 보냈을 때, 첫번째 쿼리에서 없던 레코드가 두번째 쿼리에서 나타나는 현상.
- ex) 어떤 트랜잭션이 조회한 데이터에 다른 트랜잭션이 값을 삽입. 그리고 다시 조회.
Reference
면접을 위한 CS 전공지식 노트(주홍철) p.206-212
https://gyoogle.dev/blog/computer-science/data-base/Transaction.html
https://gyoogle.dev/blog/computer-science/data-base/Transaction%20Isolation%20Level.html