-
트랜잭션과 격리 수준 (Isolation Level)개발/DB 2022. 12. 30. 15:38
트랜잭션(Transaction)이란?
- 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위
- SELECT, INSERT, DELETE, UPDATE (SQL) 하나만을 의미하는게 아니다. 하나의 작업에는 여러개의 질의어가 포함될 수 있다.
트랜잭션의 특징
- ACID
- 원자성 (Atomicity)
- 데이터베이스에 모두 반영되던가 (commit), 모두 반영되지 않던가 (rollback,aborted)
- 일관성 (Consistency)
- 트랜잭션의 작업 처리 결과가 항상 일관성 있어야 한다.
- 트랜잭션이 진행되는 동안 데이터베이스가 변경되더라도, 업데이트 이전의 데이터베이스에 트랜잭션이 진행됨으로써 일관성 있게 데이터를 처리한다.
- 독립성 (Isolation)
- 둘 이상의 트랜잭션이 동시 실행 되고있는 경우, 하나의 트랜잭션이 완료될 때 까지, 다른 트랜잭션이 해당 트랜잭션의 결과를 참조할 수 없다.
- 지속성 (Durability)
- 트랜잭션이 성공적으로 완료됐을 경우, 결과는 영구적으로 반영되어야 한다.
- 원자성 (Atomicity)
트랜잭션 격리 수준 (Isolation Level) 이란?
- 동시에 여러 트랜잭션이 처리될 때, 트랜잭션끼리 서로 얼마나 고립되어 있는지를 나타내는 것.
- 즉, 특정 트랜잭션이 다른 트랜잭션에 변경한 데이터를 볼 수 있도록 허용할지 말지를 결정
격리 수준간 차이
- 격리 수준은 아래 4개로 나뉜다. 아래로 갈수록 격리 수준이 높아지며, 성능이 떨어진다.
1. READ UNCOMMITTED
- 트랜잭션 진행간, Commit 되지 않은 데이터를 참조하여 트랜잭션을 진행한다.
- Dirty Read 문제가 발생할 수 있다.
- 1. A 트랜잭션에서 A 테이블의 데이터를 수정중인 상태 (Commit 전)
- 2. B 트랜잭션에서 A 테이블의 데이터를 조회 (Commit 전이지만 A 트랜잭션에 의해 수정된 데이터를 조회해옴.) -> Dirty Read
- 3. A 트랜잭션에서 문제가 발생해 Rollback
- 4. B 트랜잭션은 A 트랜잭션에 의해 수정된 데이터를 이용하여 트랜잭션을 진행함.
2. READ COMMITTED (Oracle Default)
- 1과 달리 Commit 된 데이터만 조회해온다.
- UNDO 영역에 저장된 데이터를 참조하기 때문에 Dirty Read가 발생하지 않는다.
- 하지만 NON-REPEATABLE READ 부정합 문제가 발생할 수 있다.
- B 트랜잭션에서 ID 1번 상품의 가격을 조회 => 10,000원
- A 트랜잭션에서 ID 1번 상품의 가격을 10,000 -> 20,000원으로 수정 후 Commit
- B 트랜잭션에서 ID 1번 상품의 가격을 다시 조회 => 20,000원 (NON-REPEATABLE READ)
3. REPETABLE READ (MySQL Default)
- 트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 조회할 수 있음.
- 자신의 트랜잭션 번호보다 낮은 트랜잭션 번호에서 Commit된 데이터만 조회함.
- 자신의 트랜잭션 번호보다 높은 트랜잭션에 의해 변경된 데이터는 Commit에 상관 없이 UNDO 영역만 조회.
- 2와 달리 NON-REPEATABLE READ 부정합 문제가 발생하지 않는다.
- A 트랜잭션(no: 10)에서 ID 1번 상품의 가격을 조회 => 10,000원
- B 트랜잭션(no: 12)에서 ID 1번 상품의 가격을 10,000 -> 20,000원으로 수정 후 Commit
- A 트랜잭션에서 ID 1번 상품의 가격을 다시 조회 => 10,000원
4. SERIALIZABLE
- 트랜잭션에서 데이터 SELECT 시 공유잠금을 설정함으로써, 해당 데이터를 수정하지 못하도록 설정함.
- 격리수준을 REPETABLE READ 로 적용하면 뭐든 해결인가? => 아니다. Phantom READ (유령읽기) 문제가 발생한다.
- A 트랜잭션에서 SELECT * FROM PRODUCT WHERE PRODUCT_ID < 5 => 1개 상품 조회
- B 트랜잭션에서 id 3인 상품 신규 생성 후 커밋
- A 트랜잭션에서 동일한 SQL 실행 => 2개 상품 조회