트랜잭션
데이터베이스 관리 시스템 또는 유사한 시스템에서 상호 연관된 작업들을 묶어서 하나의 작업으로 처리하는 것을 말한다.
트랜잭션은 속칭 ACID라고 불리는 특징들을 보장해야 한다.
- 원자성(Atomicity) : 트랜잭션은 성공 또는 실패로 끝나야 한다. 즉, 트랜잭션 내의 모든 작업이 성공하면 성공하고, 하나라도 실패하면 실패해야 한다.
- 일관성(Consistency) : 트랜잭션이 실행을 성공적으로 완료하면 일관성 있는 상태로 유지되어야 한다.
- 데이터베이스에서 정한 무결성 제약 조건을 만족해야 한다.
일관성 제약 조건이 잘 지켜지는 예시
예를 들어 은행 계좌 시스템에서의 일관성을 생각해볼 수 있습니다. 계좌 이체 트랜잭션을 실행할 때, 일관성 조건에 따라 다음과 같은 요구사항이 충족되어야 합니다:
- 잔액 검증: 이체를 하기 전에 이체하는 계좌에 충분한 잔액이 있는지 확인해야 합니다. 잔액이 부족한 경우, 트랜잭션은 실패해야 합니다.
- 원자성 보장: 이체 트랜잭션은 원자성을 가져야 하며, 이는 이체 과정이 전부 아니면 전혀 이루어지지 않아야 함을 의미합니다. 즉, 금액을 출금하는 작업과 입금하는 작업이 모두 성공적으로 완료되어야 하며, 하나라도 실패하면 전체 트랜잭션이 롤백되어야 합니다.
- 무결성 제약 조건 준수: 모든 이체 후 계좌의 잔액은 반드시 0보다 크거나 같아야 합니다. 마이너스 잔액은 허용되지 않습니다.
- 격리성(Isolation) : 트랜잭션은 다른 트랜잭션에 영향을 받지 않고 독립적으로 실행되어야 한다.
- 지속성(Durability) : 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 반영되어야 한다.
- 중간에 시스템에 문제가 발생해도 데이터베이스 로그 등을 사용해서 복구할 수 있어야 한다.
격리 수준
- READ_UNCOMMITTED (level 0)
- 트랙잭션에 처리중인 혹은 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.
- 어떤 사용자가 A라는 데이터를 B라는 데이터로 변경하는 동안 다른 사용자는 B라는 아직 완료되지 않은 Dirty 데이터를 읽을 수 있다.
- Dirty Read : 다른 트랜잭션에서 처리 작업이 끝나지 않았는데 읽을 수 있는 것 (READ_UNCMMITED에서만 발생하는 현)
- 예를 들어, 트랜잭션 A가 데이터를 수정하고 있지만 아직 커밋하지 않았는데, 트랜잭션 B가 그 수정 중인 데이터를 읽으면, 트랜잭션 A가 롤백되어 수정이 취소된 경우 B는 잘못된(더 이상 존재하지 않는) 데이터를 읽게 됩니다.
- READ_COMMITTED (level 1)
- 트랜잭션이 커밋되어 확정된 데이터만 읽는 것을 허용한다.
- Dirty Read 현상은 방지할 수 있지만 Non-Repeatable Read를 현상이 발생할 수 있다.
- Non-Repeatable Read : 한 트랜잭션 내에서 같은 데이터를 두 번 조회했을 때 두 조회 결과가 다른 경우 발생하는 현상이다.
- 트랜잭션에서 2번 SELECT를 하고 첫 번째 SELECT와 두 번째 SELECT 사이에 B 트랜잭션에서 수정을 한다면 A 트랜잭션의 두 SELECT 쿼리는 서로 다른 결과를 가지고 있게 된다.
- REPEATABLE_READ (level 2)
- 트랜잭션이 완료될 때 까지 SELECT 문장이 사용하는 모든 데이터에 shared lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한
수정이 불가능
하다. (읽기는 가능)- 한 트랜잭션 동안 두 번의 SELECT 쿼리가 일어난다면 이 격리 level에서는 그 트랜잭션 동안 데이터 수정이 불가능해서 두 쿼리의 값이 동일하게 되는 것이다.
- Non-Repeatable을 방지할 수 있지만 여전히 Phantom Read 문제는 발생한다.
- Phantom Read : 한 트랜잭션 내에서 같은 쿼리를 두 번 실행했을 때 결과 집합의 행이 다른 경우 발생합니다.
- 즉,
Phantom Read
는삽입, 삭제
에 관한것이고Non-Repeatable Read
는수정
에 관한 것이다.
- 트랜잭션이 완료될 때 까지 SELECT 문장이 사용하는 모든 데이터에 shared lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한
- SERIALIZABLE (level 3)
- 트랜잭션이 완료될 때까지 읽기, 수정, 입력이 모두 불가능하다.