try/finallyを使ってちゃんとローカルトランザクションを実行する
上の例では省いていますが、ローカルトランザクションはbeginしたら必ずcommitかrollbackする必要があります(ただし同じスレッド内であれば異なるインスタンスのcommit/rollbackでもいい)。rollbackはトランザクションがアクティブであろうとなかろうと呼びだせるようになっています。というわけで、次のようにtry/finallyを使うのが最適です。
// トランザクションを取得 LocalTransaction tx = AppConfig.getLocalTransaction(); try { // トランザクション開始 tx.begin(); // 検索して更新 LocalEmployee employee = dao.selectById(1); employee.employeeName = "hoge"; dao.update(employee); // コミット tx.commit(); } finally { // ロールバック tx.rollback(); }
rollbackはcommit後に呼び出してもOK。たとえbeginで失敗しても呼び出してもOK。
もちろん、どのメソッドも実行時例外しか投げません。