残業続きでとても眠いので、ごく簡単に済ませたいと思います。誤字脱字は許してね(´・ω・`)
やりたいことはタイトルの通り。MyBatis-Springではトランザクション管理をMyBatis-Springに一任します。つまりプログラマはコミットやロールバックなどを明示的に呼び出す必要はないのですが……とはいえトランザクション管理をプログラム的に行いたい場面があるのも事実です。
まずトランザクション管理について、Springの設定用xmlに次のようなbean定義がなされているとします。
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
次にMybatisについて、Mapperインターフェイスが次のように存在するとします。
public interface Dao {
@Insert("INSERT INTO user VALUES(#{userid}, #{name})")
int insertUser(@Param("userid") Stringuserid, @Param("name") String name)
@Update("UPDATE user SET name = #{name} WHERE userid = #{userid}")
int updateUser(@Param("userid") String userid, @Param("name") String name)
}
さてMyBatis-Springにおいて、明示的にトランザクション管理を行う場合はTransactionManager
を利用します。具体的には以下の通りです。
public class Service {
@Autowired Dao dao;
@Autowired PlatformTransactionManager txManager;
public void sample(String userid, String name) {
// トランザクション管理の開始
DefaultTransactionDefinition txDefinition = new DefaultTransactionDefinition();
txDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus txStatus = txManager.getTransaction(txDefinition);
try {
// DBに対するアクセスを実行
dao.insertUser(userid, name);
dao.updateUser(userid, name);
// DBへのアクセスが問題なく終了した場合は処理を確定させる
txManager.commit(txStatus);
} catch (Exception e) {
// 何らかの事情で更新処理に失敗した場合は処理をロールバックする
txManager.rollback(txStatus);
}
}
}
簡単ですね(´・ω・`)