プログラムでトランザクション制御

基本的にはアノテーショントランザクション制御するけど、
独自にコミットしたいなーって時もあるわけで、そんなテスト。

@Service
public class HogeServiceImpl implements HogeService {

    @Autowired
    private PlatformTransactionManager transactionManager;

    public void execute() throws Exception {
        DefaultTransactionDefinition transactionDefinition 
            = new DefaultTransactionDefinition(TransactionDefinition.REQUIRED);
        TransactionStatus status = transactionManager.getTransaction(transactionDefinition);

        try {
            // なんか更新処理
        } catch (Exception e) {
            transactionManager.rollback(status);
            throw e;
        }
        transactionManager.commit(status);

        status = transactionManager.getTransaction(transactionDefinition);
        try {
            // なんか更新処理
        } catch (Exception e) {
            transactionManager.rollback(status);
            throw e;
        }
        transactionManager.commit(status);
    }
}

マニュアルまんまなわけですが、2個目がコケても1個目はちゃんと更新されている。
ログを見るとなんとなくできているようで。
前もあったけど、Spring-MyBatisで連携しているとトランザクション制御
されてなくても勝手にSQLが実行されちゃったりするので、ログをきちんと
見てないと怖い。


メソッド分けてアノテーション付ければいけるのかと思ったけど、
どうも動かなかった。まぁトランザクション制御したいがために
メソッド分けるのもどうかなーというのもあるし。


さて、このトランザクションをコミットも何もしなかった場合、
はたしてどうなるのかなぁ。
try-catchがきちんと実装できないなんてザラにあるし・・・。