9.6. Programmatic transaction management
선언적인 방법이 아니고 프로그래밍을 통해 트랜잭션 관리를 할 때 두 가지 경우가 있습니다.
1. TransactionTemplate 사용 할 경우
2. PlatformTransactionManager 를 구현한 클래스를 직접 사용 할 경우
9.6.1. Using the TransactionTemplate
이렇게 멤버로 지정해 놓고 사용하면 됩니다. 먼저 트랜잭션의 속성을 설정하는 방법은 다음과 같습니다.
Assert.notNull(transactionManager, "The 'transactionManager' argument must not be null.");
this.transactionTemplate = new TransactionTemplate(transactionManager);
// the transaction settings can be set here explicitly if so desired this.transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_UNCOMMITTED);
this.transactionTemplate.setTimeout(30); // 30 seconds
// and so forth...
}
아니면 XML에서 설정하고 세터나 생성자 인젝션을 사용하면 되겠습니다.
class="org.springframework.transaction.support.TransactionTemplate>
<property name="isolationLevelName" value="ISOLATION_READ_UNCOMMITTED"/>
<property name="timeout" value="30"/>
</bean>
트랜잭션 탬플릿을 사용해서 어떤 작업을 할 때는 다음과 같이 TransactionCallback 을 사용합니다. 탬플릿과 콜백에 대한 이해는 이 글을 참조하시길 초 강추 합니다.
1. 리턴 값이 있는 경우
return transactionTemplate.execute(new TransactionCallback() {
// the code in this method executes in a transactional context
public Object doInTransaction(TransactionStatus status) {
updateOperation1();
return resultOfUpdateOperation2();
}
});
}
2. 리턴 값이 없는 경우
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
updateOperation1();
updateOperation2();
}
});
}
9.6.2. Using the PlatformTransactionManager
// explicitly setting the transaction name is something that can only be done programmatically
def.setTransactionName("SomeTxName");
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = txManager.getTransaction(def);
try {
// execute your business logic here
}
catch (MyException ex) {
txManager.rollback(status);
throw ex;
}
txManager.commit(status);
TransactionDefinition, TransacionStatus, TransactionManager 객체를 직접 사용하여 트랜잭션 속성을 설정하고 롤백 또는 커밋을 하는 코드를 직접 작성하는 방법입니다. 이 세개의 객체들에 대한 관계는 without EJB의 트랜잭션 부분 242페이지에 잘 나와있습니다.