Spring의 트랜잭션 추상화 계층에서 트랜잭션 전략(transaction strategy)이 중요한 개념 중 하나입니다.

트랜잭션 전략을 위해서 PlatformTransactionManager 인터페이스를 사용합니다.

public interface PlatformTransactionManager {

    TransactionStatus getTransaction(TransactionDefinition definition)
        throws TransactionException;

    void commit(TransactionStatus status) throws TransactionException;

    void rollback(TransactionStatus status) throws TransactionException;
}

1. 인터페이스 라는 것.
= 필요할 때 mock이나 stub을 만들어 사용할 수 있다. => 테스트 용이함.
= 인터페이스를 활용하여 구현 가능. => OOP 원칙 따름.

2. 위 인터페이스에 있는 모든 메소드에서 unchecked 예외를 발생시킨다는 것.
= 불 필요한 try-catch 문 사용 안 해도 됨.
= 물론 잡을 수 도 있지만 치명적이기 때문에 마땅히 할 수 있는 일도 없다. => 그냥 안 잡는게 타당함.

PlatformTransactionManager 인터페이스를 구현한 클래스들 입니다.[footnote]HibernateTransactionManager가 두 개 인데요. 이 중에 하나는 Hibernate 3쩜대 용입니다.[/footnote]
AbstractPlatformTransactionManager, CciLocalTransactionManager, DataSourceTransactionManager, HibernateTransactionManager, HibernateTransactionManager, JdoTransactionManager, JmsTransactionManager, JmsTransactionManager102, JpaTransactionManager, JtaTransactionManager, OC4JJtaTransactionManager, TopLinkTransactionManager, WebLogicJtaTransactionManager

첫번째에 있는 메소드를 좀 더 자세히 살펴보겠습니다.

인자로 TransactionDefinition 인터페이스를 넘겨 주고 TransactionStatus 인터페이스 타입의 객체를 받아 올 수 있습니다.

TransactionDefinition 인터페이스
에서 다음의 트랜잭션 속성을 설정할 수 있습니다.

Isolation: 다른 트랜잭션의 작업으로 부터 해당 트랜잭션이 얼마나 고립되어 있는지 정도.
ex) 다른 트랙잭션에 의해 쓰여졌지만 커밋은 되지 않은 것을 볼 수 있는가?

Propagation: 기존에 존재하는 트랜잭션 문맥이 있는 상태에서 어떻게 수행할지 선택할 수 있는 옵션.
ex1) 그냥 기존에 있는 트랜잭션 내에서 처리 한다.
ex2) 기존의 트랜잭션을 종료하고 새로운 트랜잭션에서 처리한다.

Timeout: 정해 준 시간이 지날 경우 타임 아웃 되며 자동으로 롤백 됩니다.

Read-only status: 이 상태로 설정해 주면 어떤 데이타도 수정할 수 없습니다. 최적화를 위해 유용하게 사용할 수 있습니다. (such as when using Hibernate).

TransactionStatus 인터페이스는 이름 그대로 트랜잭션의 상태에 관한 정보를 가져올 수 있고 예외를 발생하는 방법이 아닌 프로그래밍 적으로 롤백을 설정할 수 있습니다.