プログラムでトランザクション制御
基本的にはアノテーションでトランザクション制御するけど、
独自にコミットしたいなーって時もあるわけで、そんなテスト。
@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がきちんと実装できないなんてザラにあるし・・・。