정의
모든 작업의 완전성을 보장해야하는 논리적인 작업의 단위
사전적 의미로는 거래
목적 및 특징
목적
Ex) 물물 교환에서 돈을 주고 집을 사기로 했는데, 돈은 줬는데 집은 못 받는 상황이 발생한다면 거래를 무효로 해야한다. 모든 작업이 완전히 이루어지지 않았기 때문이다.
위와 같이 어떠한 작업은 모든 행위가 성공해야 작업이 성공적으로 끝났다고 할 수 있는 작업 단위가 있다.
이러한 여러 개의 작업들을 논리적으로 묶어놓는 것이 Transaction의 목적이다.
특징
- 원자성: 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공 하거나 모두 실패해야
한다.
- 일관성: ****모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를 들어 데이터베이스에서
정한 무결성 제약 조건을 항상 만족해야 한다.
- 격리성: 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다. 예를 들어 동시에 같은
데이터를 수정하지 못하도록 해야 한다. 격리성은 동시성과 관련된 성능 이슈로 인해 트랜잭션 격리 수준
(Isolation level)을 선택할 수 있다.
- 지속성: 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다. 중간에 시스템에 문제가 발생해도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야 한다.
트랜잭션 격리 수준 - Isolation level
트랜잭션 간에 격리성을 완벽히 보장하려면 트랜잭션을 거의 순서대로 실행해야 한다. 이렇게 하면 동시 처리 성능이 매우 나빠진다. 이런 문제로 인해 ANSI 표준은 트랜잭션의 격리 수준을 4단계로 나누어 정의한다.
- READ UNCOMMITED(커밋되지 않은 읽기)
- 커밋하지 않은 데이터를 읽을 수 있다.(Dirty Read 발생)
- Dirty Read: Transaction1이 데이터를 수정하고 있는데 커밋하지 않아도 Transaction2이 수정 중인 데이터를 조회
- Transaction2이 읽은 데이터를 사용하는데 Transaction1이 롤백하면 데이터 정합성에 문제 발생
- READ COMMITTED(커밋된 읽기)
- 커밋한 데이터만 읽을 수 있다.(Dirty Read 발생하지 않음)
- 커밋한 데이터만 읽을 수 있다. 하지만
- Non-Repeatable Read: Transaction1이 데이터를 조회 중인데 Transaction2가 데이터를 수정하고 커밋하면 Transaction1이 다시 데이터를 조회했을 때 같은 데이터를 읽을 수 없는 상태
- REPEATABLE READ(반복 가능한 읽기)
- 한 번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회된다. 하지만
- Phantom Read: Transaction1이 20살 이하 회원을 조회했는데, Transaction2가 18살 회원을 추가하고 커밋하면 Transaction1이 다시 조회했을 때 회원이 추가된 상태로 조회되는 것
- 반복 조회시 결과 집합이 달라지는 것
- SERIALIZABLE(직렬화 가능)
- 가장 엄격한 Transaction 격리 수준
- Phantom Read가 발생하지 않지만 동시성 처리 성능이 급격히 떨어질 수 있다.
Transaction 전파 옵션(Propagation)
REQUIRED
: 이미 시작된 트랜잭션이 있으면 참여하고, 없으면 새로운 트랜잭션을 시작합니다. (디폴트 속성)
SUPPORTS
: 이미 시작된 트랜잭션이 있으면 참여하고, 없으면 트랜잭션 없이 처리합니다.
REQUIRED_NEW
: 항상 새로운 트랜잭션을 시작합니다. 이미 진행중인 트랜잭션이 있다면 잠시 보류시킵니다.
MANDATORY
: 이미 시작된 트랜잭션이 있으면 참여하고, 없으면 새로운 트랜색션을 시작하는 대신 예외를 발생시킵니다. 혼자서는 독립적으로 수행되면 안되는 경우에 사용됩니다.
NOT_SUPPORTED
: 트랜잭션을 사용하지 않고 처리하도록 합니다. 이미 진행중인 트랜잭션이 있다면 잠시 보류시킵니다.
NEVER
: 트랜잭션을 사용하지 않도록 강제시킵니다. 이미 진행중인 트랜잭션 또한 허용하지 않으며, 있다면 예외를 발생시킵니다.
NESTED
: 이미 실행중인 트랜잭션이 있다면 중첩하여 트랜잭션을 진행합니다. 부모 트랜잭션은 중첩 트랜잭션에 영향을 주지만 중첩 트랜잭션은 부모 트랜잭션에 영향을 주지 않습니다.
주의할 점
- 트랜잭션의 범위는 최소화
- 트랜잭션의 범위를 최소화 하는 것이 중요하다.
데이터베이스의 커넥션의 수는 한정적이기 때문에 커넥션을 보유하는 시간을 최소화해야할 필요가 있다.
그렇지 않으면, 다른 서비스들은 해당 커넥션 사용을 위해 대기해야하는 상황이 발생한다.
- 교착상태 회피
- 두개 이상의 트랜잭션이 해당 자원에 대한 잠금을 보유한 채, 서로의 자원에 대해 접근을 했을 때 교착상태 발생 가능하다.
트랜잭션은 자주 커밋하자. (잠금을 오래 보관하지 않기 위해)
예시
장점
단점