LoginSignup
11
9

More than 5 years have passed since last update.

MyBatis-Springでプログラム的にトランザクション管理をする

Last updated at Posted at 2016-10-08

残業続きでとても眠いので、ごく簡単に済ませたいと思います。誤字脱字は許してね(´・ω・`)

やりたいことはタイトルの通り。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);
        }   
    }
}

簡単ですね(´・ω・`)

11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9