ActiveObjectsプラグインモジュールのデータベーストランザクション
Atlassianプラットフォーム内のActiveObjectsプラグインモジュールでのデータベーストランザクションについてまとめました。
executeInTransactionメソッドによるトランザクション
トランザクションはActiveObjectsコンポーネントのexecuteInTransactionメソッドを呼び出すことで実現できます。データベース処理内容はexecuteInTransactionメソッドの引数となるTransactionCallback抽象クラスのdoInTransactionメソッドの中へ記述します。
public void someMethod(final ActiveObjects ao) { ao.executeInTransaction(new TransactionCallback<Object>() { @Override public Object doInTransaction() { // データベース処理内容 } }); }
Java8以降であればラムダ式で記述できます。
public void someMethod(final ActiveObjects ao) { ao.executeInTransaction(() -> { // データベース処理内容 }); }
トランザクションの制御はnet.java.ao.Transactionクラスのexecuteメソッドで定義されています。同クラスのrunメソッドの呼び出しが成功すればコミット、失敗(例外発生)すればロールバックを自動的に行います。データベース処理内容は上記の通りdoInTransactionメソッド内で定義されていますが、これはcom.atlassian.activeobjects.internal.EntityManagedTransactionManagerクラスによってrunメソッド内から呼び出されるようになります。
Transactionアノテーションよるトランザクション
Transactionアノテーションを用いてトランザクションを実現することもできます。トランザクションはTransactionアノテーションが記述されたクラスのメソッド毎に実行します。
@Transaction public class SomeClass{ public void someMethod(final ActiveObjects ao) { // データベース処理内容 } }
トランザクションの制御については上記と同様です。
コミット及びロールバックは非対応
ActiveObjectsプラグインモジュールではトランザクションの実装はできますが、コミット及びロールバックの呼び出しには対応しておりません。そのため、トランザクション一連の処理がメソッド内で完結するように記述する必要があります。
ちなみに、標準のActiveObjectsライブラリではコミット及びロールバックの呼び出しができます。ActiveObjectsプラグインモジュールとは別物なのでこの記事では扱いませんが、詳しくはEntityManagerインターフェースのgetTransactionメソッドもしくはEntityTransactionインターフェースをご覧ください。