Transactionサンプル
applicationContext.xml
<beans>
<bean id="myAction" class="com.app.TestAction">
<property name="jdbcTemplate><ref bean="jdbcTemplate"/></property>
</bean>
<!-- jdbcTemplateの定義 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource"><ref local="dataSource"/></property>
</bean>
<!-- コネクションプーリングの定義 -->
<bean id="dataSource" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">
<property name="dataSource"><ref bean="xaDataSource"/></property>
</bean>
<!-- XAデータソース -->
<bean id="xaDataSource" class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">
<property name="transactionManager"><ref bean="jotm"/></property>
<property name="driverName"><value>org.postgresql.Driver</value></property>
<property name="url"><value>jdbc:postgresql://host:port/db?user=xxx&password=xxx</value></property>
</bean>
<!-- JOTM -->
<bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean"/>
<!-- SpringのUserTransaction -->
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="userTransaction"><ref bean="jotm"/></property>
</bean>
<!-- Base DAO -->
<bean id="sampledb_dao" class="com.app.SampleDbDAO">
<property name="jdbcTemplate"><ref bean="jdbcTemplate"/></property>
</bean>
</beans>
Java Source
// DAO
final BaseDAO dao = (BaseDAO)wac.getBean("sampledb_dao");
// プログラミングによるトランザクション制御
PlatformTransactionManager txManager = (PlatformTransactionManager)wac.getBean("transactionManager");
// TransactionTemplateを使用する
TransactionTemplate txTemplate = new TransactionTemplate(txManager);
txTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
dao.insertData("hoge1", "Yaaaahooooo!!!");
dao.insertData("hoge2", "Hyaaaaaaaaa!!!");
// rollback
status.setRollbackOnly();
}
});
/*
// トランザクションの属性設定
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
// トランザクションの開始
TransactionStatus status = txManager.getTransaction(def);
// DAO呼び出し(更新)
dao.insertData("hoge", "Really?");
dao.insertData("hoge2", "Happy!");
// ロールバック
txManager.rollback(status);
*/