트랜잭션이란?
트랜잭션은 데이터베이스 관리시스템(DBMS)에서 하나의 작업의 단위를 의미합니다.
트랜잭션의 4가지 특성을 ACID 특성이라고 부릅니다.
- 원자성 (Atomicity) : 원자성이란 트랜잭션이 수행하는 연산들을 모두 정상적으로 처리하거나
- 모두 처리하지 않아야 한다는 All-Or-Nothing 방식을 의미합니다.
- 일관성 (Consistency) : 일관성은 트랜잭션이 성공적으로 수행된 이후에도 데이터베이스의 데이터는
- 일관된 상태를 유지해야 한다는 의미입니다.
- 격리성 (Isolation) : 격리성은 하나의 트랜잭션이 완료될 때까지 다른 트랜잭션이 간섭하지 못하도록
- 하여 각각의 트랜잭션이 독립적으로 수행되어야 한다는 의미입니다.
- 지속성 (Durability) : 지속성은 트랜잭션이 성공적으로 완료된 이후에 데이터베이스의 데이터들이
- 영구적으로 보존되어야 한다는 의미입니다.
Commit과 Rollback
하나의 트랜잭션이 성공적으로 끝났고, 데이터베이스가 일관성 있는 상태일 때 이를 알려주기 위해 사용하는
연산을 Commit이라고 합니다. 하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션 원자성이 깨진 경우
수행할 수 있는 연산을 Rollback이라고 합니다. 트랜잭션이 정상적으로 종료되지 않았을 때, last consistent
state(ex 트랜잭션의 시작 상태)로 Rollback 할 수 있습니다.
트랜잭션 격리수준(Transaction Isolation Level)
트랜잭션에서 일관성 없는 데이터를 허용하도록 하는 수준을 의미합니다.
데이터베이스는 트랜잭션이 독립적인 수행을 하도록 합니다.
따라서 트랜잭션이 데이터베이스를 다루는 동안 Locking을 이용하여 다른 트랜잭션이 관여하지 못하도록
막는 것이 필요합니다. 하지만 무조건 Locking으로 동시에 수행되는 수많은 트랜잭션들을 순서대로 처리하는
방식으로 구현하면 성능이 떨어집니다. 반면, 성능을 높이기 위해 Locking의 범위를 줄인다면 잘못된 값이
처리될 문제가 발생할 수 있습니다. 따라서 최대한 효율적인 Locking 방법이 필요합니다.
Isolation level 종류
- Read Uncommitted (레벨 0)
- 각 트랜잭션의 Commit나 Rollback 여부에 상관 없이 다른 트랜잭션에서 값을 읽을 수 있다.
- 정합성에 문제가 많은 격리 수준이다.
- 아래와 같이 Commit이 되지 않은 상태지만 Update된 값을 다른 트랜잭션에서 읽을 수 있다.
- Read Committed (레벨 1)
- Commit이 이루어진 것만 다른 트랜잭션에서 값을 읽을 수 있다.
- 오라클 DBMS에서 기본으로 사용하고 있는 격리 수준이다.
- 트랜잭션1이 Commit 한 이후 아직 끝나지 않는 트랜잭션2가 다시 테이블 값을 읽으면 동일하지
- 않은 값을 읽어온다.
- 하나의 트랜잭션내에서 똑같은 SELECT 쿼리를 실행했을 때는 항상 같은 결과를 가져와야 하는
- REPEATABLE READ의 정합성에 어긋난다.
- Repeatable Read (레벨 2)
- 트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 조회할 수 있는 격리수준이다.
- MySQL DBMS에서 기본으로 사용하고 있는 격리 수준이다.
- 트랜잭션마다 ID를 부여하여 자신의 트랜잭션 번호보다 낮은 번호에서 변경된 것만 본다.
- Serializable (레벨 3)
- 가장 단순한 격리 수준이지만 가장 엄격한 격리 수준
- 성능 측면에서는 동시 처리성능이 가장 낮다.
선택 시 고려사항
Isolation Level에 대한 조정은, 동시성과 데이터 무결성에 연관되어 있음
동시성을 증가시키면 데이터 무결성에 문제가 발생하고, 데이터 무결성을 유지하면 동시성이 떨어지게 됨
레벨을 높게 조정할 수록 발생하는 비용이 증가함
낮은 단계 Isolation Level을 활용할 때 발생하는 현상들
- Dirty Read
- 커밋되지 않은 수정중인 데이터를 다른 트랜잭션에서 읽을 수 있도록 허용할 때 발생하는 현상
- 어떤 트랜잭션에서 아직 실행이 끝나지 않은 다른 트랜잭션에 의한 변경사항을 보게되는 경우
- Non-Repeatable Read
- 한 트랜잭션에서 같은 쿼리를 두 번 수행할 때 그 사이에 다른 트랜잭션 값을 수정 또는 삭제하면서 두 쿼리의 결과가 상이하게 나타나는 일관성이 깨진 현상
- Phantom Read
- 한 트랜잭션 안에서 일정 범위의 레코드를 두 번 이상 읽었을 때, 첫번째 쿼리에서 없던 레코드가 두번째 쿼리에서 나타나는 현상 트랜잭션 도중 새로운 레코드 삽입을 허용하기 때문에 나타나는 현상