Transaction
Transaction
Transaction이란
데이터베이스에 수행되는 작업의 논리적 단위. 다음과 같이 네 가지 속성을 가짐
- Atomicity
- Consistency
- Isolation
- Durability
Atomicity
트랜잭션은 하나의 단위로써 실행됨. 완전히 실행되어 DB에 반영되거나 아무것도 반영되지 않아야 함.
Consistency
트랜잭션은 DB의 불변성을 유지하면서 상태를 변화시킴. 트랜잭션 실행 결과는 모두 일관적으로 규칙을 따라야 함.
Isolation
완료되지 않은 트랜잭션의 결과는 다른 트랜잭션에서 볼 수 없음. 즉, 한 트랜잭션 중 다른 트랜잭션이 끼어들 수 없음.
- 다만 동시성 문제 때문에 완벽하게 보장하지는 않고 실제로는 완화됨.
Durability
트랜잭션이 commit 되면 시스템 장애가 생겨도 영구적으로 반영되어야 함.
Commit
트랜잭션에 의해 변경된 데이터를 DB에 영구적으로 반영하는 연산.
Rollback
트랜잭션 실행 도중 변경 사항을 취소하는 연산.
데이터가 변경되면 UNDO 영역에 정보가 생기는데, 이를 활용해 원래 상태로 되돌림.
Savepoint
Rollback할 위치를 저장해 두는 연산. Rollback시 savepoint를 명시해서 해당 위치로 되돌릴 수 있음.
Transaction Isolation Level
동시에 여러 트랜잭션이 처리될 때 다른 트랜잭션에서 변경 / 조회하는 데이터를 볼 수 있게 해 주는 수준.
다음은 낮은 isolation level 부터 높은 순으로 나열한 것.
- READ UNCOMMITTED
- READ COMMITTED
- REPETABLE READ
- SERIALIZABLE
낮은 isolation level은 데이터를 적게 잠구기 때문에 동시성이 높아지지만, read phenomena가 많이 발생. 높은 경우 이 반대.
Read Phenomena
Isolation level이 낮을 때 여러 트랜잭션의 실행으로 인해 생기는 현상들.
- Dirty reads
- Non-repeatable reads
- Phantom reads
READ UNCOMMITTED
각 트랜잭션에서 변경한 내용을 commit하지 않아도 다른 트랜잭션에서 값을 읽을 수 있는 레벨. Consistency가 굉장히 낮아지기 때문에 비추천.
- 트랜잭션이 끝나지 않은 데이터를 읽는 dirty reads 현상 발생 가능.
READ COMMITTED
READ UNCOMMITTED에서 커밋된 데이터만 읽게 함으로써 dirty reads를 방지한 레벨. 실제 테이블의 데이터가 아닌 UNDO 영역의 정보를 가져 옴.
- 한 트랜잭션에서 select를 두 번 실행했을 때 결과값이 다른 non-repeatable reads 현상 발생 가능.
REPETABLE READ
READ COMMITTED에서 non-repeatable reads를 방지한 레벨. 각 트랜잭션은 본인의 ID보다 작은 ID를 가진 트랜잭션의 번호에서 변경한 것만 읽게 됨.
- 한 트랜잭션에서 레코드를 읽는 중에 새로운 행이 등장하거나 제거되는 phantom reads 현상 발생 가능.
SERIALIZABLE
REPETABLE READ에서 쓰기 잠금을 걺으로 인해 phantom reads를 방지한 레벨. 가장 높은 수준의 격리 수준이나, 동시성이 낮다는 문제점 존재.
References
- https://en.wikipedia.org/wiki/Database_transaction
- https://en.wikipedia.org/wiki/ACID
- https://en.wikipedia.org/wiki/Isolation_(database_systems)
- https://nesoy.github.io/articles/2019-05/Database-Transaction-isolation
- https://gyoogle.dev/blog/computer-science/data-base/Transaction.html
- https://hoon93.tistory.com/24