Aipo内のトランザクションについて

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対で書くようにしておくのが理想です。