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インターフェースをご覧ください。