더 이상 쪼갤 수 없는 최소 단위의 작업 개념이다. 따라서 트랜잭션 경계 안에서 진행된 작업은 commit() 을 통해 모두 성공하든지 아니면 rollback()을 통해 모두 취소돼야 한다.
트랜잭션의 필요 예시
- 사용자가 상품을 결재 중일 때 해당 상품 정보를 변경해서는 안된다.
- 사용자가 결재 중일 때 해당 상품을 다른 사용자가 결재해서는 안된다.
- 오류로 인한 구매 실패의 경우 결재 금액을 환불한다.
Spring에서는 PlatformTransactionManager 인터페이스를 통해 트랜잭션에 대한 추상화를 지원한다. 사용자는 해당 클래스를 이용해 트랜잭션 시작/종료 지점을 명시적으로 결정할 수 있게 된다. 이 뿐만아니라 스프링에서는 해당 클래스의 다양한 구현체 역시 제공한다.
- DataSourceTransactionManager
- HibernateTransactionManager
- JpaTransactionManager
- JtaTransactionManager
- WebLogicJtaTransactionManager
- WebSphereUowTransactionManager
스프링에서는 또한 @Transactional 어노테이션을 지원해준다. 우리는 DB와 관련된, 트랜잭션이 필요한 클래스 혹은 메서드에 @Transactional 어노테이션을 달기만 하면 된다.
@Transactional 어노테이션은 클래스와 메서드 모두에 적용가능한데 클래스에 다는 경우 해당 클래스 및 하위 클래스까지 적용된다. 또한, 클래스와 메서드 모두에 적용하는 경우 매서드 레벨의 @Transactional 선언을 우선시 한다.
Spring의 DefaultTransactionDefinition이 구현하고 있는 TransactionDefinition 인터페이스는 트랜잭션의 동작방식에 영향을 줄 수 있는 네 가지 속성을 정의하고 있다. 해당 4가지 속성은 트랜잭션을 세부적으로 이용할 수 있게 도와주며, @Transactional 어노테이션에도 공통적으로 적용할 수 있다.
참고자료