정의

모든 작업의 완전성을 보장해야하는 논리적인 작업의 단위

사전적 의미로는 거래

목적 및 특징

목적

Ex) 물물 교환에서 돈을 주고 집을 사기로 했는데, 돈은 줬는데 집은 못 받는 상황이 발생한다면 거래를 무효로 해야한다. 모든 작업이 완전히 이루어지지 않았기 때문이다.

위와 같이 어떠한 작업은 모든 행위가 성공해야 작업이 성공적으로 끝났다고 할 수 있는 작업 단위가 있다. 이러한 여러 개의 작업들을 논리적으로 묶어놓는 것이 Transaction의 목적이다.

특징

트랜잭션 격리 수준 - Isolation level

트랜잭션 간에 격리성을 완벽히 보장하려면 트랜잭션을 거의 순서대로 실행해야 한다. 이렇게 하면 동시 처리 성능이 매우 나빠진다. 이런 문제로 인해 ANSI 표준은 트랜잭션의 격리 수준을 4단계로 나누어 정의한다.

Transaction 전파 옵션(Propagation)

  1. REQUIRED : 이미 시작된 트랜잭션이 있으면 참여하고, 없으면 새로운 트랜잭션을 시작합니다. (디폴트 속성)
  2. SUPPORTS : 이미 시작된 트랜잭션이 있으면 참여하고, 없으면 트랜잭션 없이 처리합니다.
  3. REQUIRED_NEW : 항상 새로운 트랜잭션을 시작합니다. 이미 진행중인 트랜잭션이 있다면 잠시 보류시킵니다.
  4. MANDATORY : 이미 시작된 트랜잭션이 있으면 참여하고, 없으면 새로운 트랜색션을 시작하는 대신 예외를 발생시킵니다. 혼자서는 독립적으로 수행되면 안되는 경우에 사용됩니다.
  5. NOT_SUPPORTED : 트랜잭션을 사용하지 않고 처리하도록 합니다. 이미 진행중인 트랜잭션이 있다면 잠시 보류시킵니다.
  6. NEVER : 트랜잭션을 사용하지 않도록 강제시킵니다. 이미 진행중인 트랜잭션 또한 허용하지 않으며, 있다면 예외를 발생시킵니다.
  7. NESTED : 이미 실행중인 트랜잭션이 있다면 중첩하여 트랜잭션을 진행합니다. 부모 트랜잭션은 중첩 트랜잭션에 영향을 주지만 중첩 트랜잭션은 부모 트랜잭션에 영향을 주지 않습니다.

주의할 점

  1. 트랜잭션의 범위는 최소화
    1. 트랜잭션의 범위를 최소화 하는 것이 중요하다. 데이터베이스의 커넥션의 수는 한정적이기 때문에 커넥션을 보유하는 시간을 최소화해야할 필요가 있다. 그렇지 않으면, 다른 서비스들은 해당 커넥션 사용을 위해 대기해야하는 상황이 발생한다.
  2. 교착상태 회피
    1. 두개 이상의 트랜잭션이 해당 자원에 대한 잠금을 보유한 채, 서로의 자원에 대해 접근을 했을 때 교착상태 발생 가능하다. 트랜잭션은 자주 커밋하자. (잠금을 오래 보관하지 않기 위해)

예시

Transaction을 추상화하는 이유

Transaction 동기화 매니저

선언적 Transaction VS 프로그래밍 방식 Transaction

@Transactional

장점

단점