Aipoではデータ保存時の処理として以下のように書くのが一般的です。
try{ //Modelの操作処理 Database.commit(); } catch (Exception ex) { Database.rollback(); logger.error("[Class name]", ex); }
Database.commit();
でトランザクション処理をやっています。複数テーブルへの更新処理も1トランザクション内で行うことでロールバック時の整合性が取れるようになています。
cayenne.logで見てみるとよくわかります。
--- transaction started. UPDATE eip_t_message_room SET LAST_MESSAGE = ?, WHERE ROOM_ID = ? [bind: 'テキスト', 1] === updated 1 row. +++ transaction committed.
ではここで、
try{ //Modelの操作処理1 Database.commit(); //Modelの操作処理2 Database.commit(); } catch (Exception ex) { Database.rollback(); logger.error("[Class name]", ex); }
のようにして書いた場合はどうなるでしょうか?
1つ目のDatabase.commit();でエラーになった時は特に問題ありませんが、2つめのDatabase.commit();でエラーになった場合、ロールバックされるのは2つ目のDatabase.commit();処理のみとなり、1つ目のDatabase.commit();は特にロールバックされません。
そのため、データの整合性が取れなくなることがあります。
Database.commit();とDatabase.rollback();は1対で書くようにしておくのが理想です。