[스프링3트랜잭션강좌교육/구로디지털단지스프링교육]스프링의 프로그래밍적 트랜잭션 관리(TransactionTemplate),spring framework3.X transaction
TransactionTemplate(Transaction 범위를 프로그래밍)은 JdbcTemplate와 HibernateTemplate와 같은 다른 Spring templates와 동일한 접근 방식을 적용하고 있다. 이것은 콜백(callback) 접근방법을 사용하는데, 리소스 획득과 해제작업으로부터 어플리케이션 코드를 해방시켜준다.(더 이상 try/catch/finally를 할 필요가 없다.) 다른 template처럼 TransactionTemplate는 쓰레드 안전하다.
TransactionCallback인터페이스 구현 객체와 같이 사용되어야 하며 트랜잭션 제어내에 실행될 코드는 doInTransaction 메소드 내에 두면 된다. doInTransaction이 별 문제없이 반환되면 Transaction은 Commit된다.
Transaction은 doInTransaction 메서드 단위로 처리된다.
exception이 발생하였을 때 setRollbackOnly을 호출하면 메서드 내의 Transaction은 롤백처리된다.
리턴되는 결과가 없는 경우에는 TransactionCallback 대신 TransactionCallbackWithoutResult 을 사용할 수도 있으나, TransactionCallback에서 null을 리턴해도 무방하다.
[예]
public class OrderService {
@Resource(name = "txManager")
protected DataSourceTransactionManager txManager;
protected TransactionTemplate transactionTemplate;
@PostConstruct
public void init() {
transactionTemplate = new TransactionTemplate(txManager);
}
public void myTran(final PutAccountInfoRequest request)
throws Exception {
// write log
MyTranResult result = (MyTranResult) transactionTemplate
.execute(new TransactionCallback() {
@Override
public Object doInTransaction(TransactionStatus status) {
boolean success = false;
Exception exception = null;
@Resource(name = "txManager")
protected DataSourceTransactionManager txManager;
protected TransactionTemplate transactionTemplate;
@PostConstruct
public void init() {
transactionTemplate = new TransactionTemplate(txManager);
}
public void myTran(final PutAccountInfoRequest request)
throws Exception {
// write log
MyTranResult result = (MyTranResult) transactionTemplate
.execute(new TransactionCallback() {
@Override
public Object doInTransaction(TransactionStatus status) {
boolean success = false;
Exception exception = null;
try {
// 트랜잭션1
// 트랜잭션2
} catch (Exception ex) {
exception = ex;
status.setRollbackOnly();
}return new MyTranResult();
}
});
}
// write transaction result
}
[TransactionTemplate을 주입하는 방법]
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="url">
<value>jdbc:oracle:thin:@localhost:1521:onj</value>
</property>
<property name="username">
<value>scott</value>
</property>
<property name="password">
<value>tiger</value>
</property>
</bean>
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<property name="dataSource" ref="dataSource"/>
</bean>
댓글 없음:
댓글 쓰기