• 検索結果がありません。

実際のトランザクションの使用

11.7.1. トランザクション使用の概要

次の手順は、アプリケーションでトランザクションを使用する必要がある場合に役に立ちます。

トランザクションの制御 トランザクションの開始 トランザクションのコミット トランザクションのロールバック

トランザクションにおけるヒューリスティックな結果の処理方法 トランザクションエラーの処理

トランザクションに関するリファレンス

11.7.2. トランザクションの制御

はじめに はじめに

この手順のリストでは、JTS API を使用するアプリケーションでトランザクションを制御するさまざま な方法を概説します。

トランザクションの開始 トランザクションのコミット トランザクションのロールバック

11.7.2.1.

トランザクションの開始 トランザクションの開始

この手順では、新しいトランザクションの開始方法を示します。API は、Jakarta Transactions または JTS で設定された Transaction Manager ™ を実行する場合と同じです。

1. UserTransaction のインスタンスを取得します。

@TransactionManagement(TransactionManagementType.BEAN) アノテーションを用いる と、Java Naming and Directory Interface、インジェクション、または EJB のコンテキスト

EJB が Bean 管理のトランザクションを使用する場合) を使用してインスタンスを取得できます

Java Naming and Directory Interface を使用してインスタンスを取得します。

インジェクションを使用してインスタンスを取得します。

EJB コンテキストを使用してインスタンスを取得します。

ステートレス/ステートフル Bean の場合

メッセージ駆動型 Bean の場合

new InitialContext().lookup("java:comp/UserTransaction")

@Resource UserTransaction userTransaction;

@Resource SessionContext ctx;

ctx.getUserTransaction();

2. データソースに接続したら UserTransaction.begin() を呼び出します。

結果 結果

トランザクションが開始します。トランザクションをコミットまたはロールバックするまで、データ ソースの使用はすべてトランザクションになります。

完全な例は、「Jakarta Transactions トランザクションの例」を参照してください。

注記 注記

EJB (CMT または BMT のいずれかと使用) の利点の 1 つは、コンテナーがトランザク ション処理の内部をすべて管理することです。そのため、ユーザーは JBoss EAP コンテ ナー間の XA トランザクションまたはトランザクションディストリビューションの一部 であるトランザクションを処理する必要がありません。

11.7.2.1.1. ネストされたトランザクションネストされたトランザクション

ネストされたトランザクションを用いると、アプリケーションは既存のトランザクションに埋め込まれ るトランザクションを作成できます。このモデルでは、再帰的に複数のサブトランザクションをトラン ザクションに埋め込むことができます。親トランザクションをコミットまたはロールバックせずにサブ トランザクションをコミットまたはロールバックできます。しかし、コミット操作の結果は、先祖のト ランザクションがすべてコミットしたかどうかによって決まります。

実装固有の情報は、Narayana プロジェクトドキュメンテーションを参照してください。

ネストされたトランザクションは、JTS 仕様と使用した場合のみ利用できます。ネストされたトランザ クションは JBoss EAP アプリケーションサーバーではサポートされない機能です。また、多くのデー タベースベンダーがネストされたトランザクションをサポートしないため、ネストされたトランザク ションをアプリケーションに追加する前にデータベースベンダーにお問い合わせください。

11.7.2.2.

トランザクションのコミット トランザクションのコミット

この手順では、Java Transaction を使用してトランザクションをコミットする方法を説明します。

前提条件 前提条件

トランザクションは、コミットする前に開始する必要があります。トランザクションの開始方法 は、「トランザクションの開始」を参照してください。

1. UserTransaction で commit() メソッドを呼び出します。

UserTransaction で commit() メソッドを呼び出すと、TM はトラザクションのコミットを実行

@Resource MessageDrivenContext ctx;

ctx.getUserTransaction()

try {

System.out.println("\nCreating connection to database: "+url);

stmt = conn.createStatement(); // non-tx statement try {

System.out.println("Starting top-level transaction.");

userTransaction.begin();

stmtx = conn.createStatement(); // will be a tx-statement ...

} }

UserTransaction で commit() メソッドを呼び出すと、TM はトラザクションのコミットを実行 します。

2. CMT (Container Managed Transaction) を使用する場合は、手動でコミットする必要はありま せん。

Bean がコンテナー管理トランザクションを使用するよう設定すると、コンテナーはコードで設

定したアノテーションに基づいてトランザクションライフサイクルを管理します。

結果 結果

データソースがコミットされ、トランザクションが終了します。そうでない場合は、例外が発生しま す。

注記 注記

完全な例は、「Jakarta Transactions トランザクションの例」を参照してください。

11.7.2.3.

トランザクションのロールバック トランザクションのロールバック

この手順では、Java Transactions を使用してトランザクションをロールバックする方法を説明しま す。

@Inject

private UserTransaction userTransaction;

public void updateTable(String key, String value) {

EntityManager entityManager = entityManagerFactory.createEntityManager();

try {

userTransaction.begin();

<!-- Perform some data manipulation using entityManager -->

...

// Commit the transaction userTransaction.commit();

} catch (Exception ex) {

<!-- Log message or notify Web page -->

...

try {

userTransaction.rollback();

} catch (SystemException se) { throw new RuntimeException(se);

}

throw new RuntimeException(ex);

} finally {

entityManager.close();

} }

@PersistenceContext private EntityManager em;

@TransactionAttribute(TransactionAttributeType.REQUIRED) public void updateTable(String key, String value)

<!-- Perform some data manipulation using entityManager -->

...

}

前提条件 前提条件

トランザクションは、ロールバックする前に開始する必要があります。トランザクションの開始方法 は、「トランザクションの開始」を参照してください。

1. UserTransaction で rollback() メソッドを呼び出します。

UserTransaction の rollback() メソッドを呼び出す場合、TM はトランザクションをロール バックし、データを前の状態に戻そうとします。

2. CMT (Container Managed Transaction) を使用する場合は、トランザクションを手動でロール バックする必要はありません。

Bean がコンテナー管理トランザクションを使用するよう設定すると、コンテナーはコードで設

定したアノテーションに基づいてトランザクションライフサイクルを管理します。

注記 注記

CMT のロールバックは RuntimeException が発生すると実行されます。setRollbackOnly メソッドを明示的に呼び出してロールバックを発生させることもできます。または、ア プリケーション例外の @ApplicationException(rollback=true) を使用してロールバックで きます。

結果 結果

トランザクションは TM によりロールバックされます。

注記 注記

完全な例は、「Jakarta Transactions トランザクションの例」を参照してください。

@Inject

private UserTransaction userTransaction;

public void updateTable(String key, String value)

EntityManager entityManager = entityManagerFactory.createEntityManager();

try {

userTransaction.begin():

<!-- Perform some data manipulation using entityManager -->

...

// Commit the transaction userTransaction.commit();

} catch (Exception ex) {

<!-- Log message or notify Web page -->

...

try {

userTransaction.rollback();

} catch (SystemException se) { throw new RuntimeException(se);

}

throw new RuntimeException(e);

} finally {

entityManager.close();

} }

11.7.3. トランザクションにおけるヒューリスティックな結果の処理方法

ヒューリスティックなトランザクションの結果はよく発生するものではなく、通常は例外的な原因が存 在します。ヒューリスティックという言葉は「手動」を意味し、こうした結果は通常手動で処理する必 要があります。トランザクションのヒューリスティックな結果は、「ヒューリスティックな結果」を参 照してください。

この手順では、Java Transactions を使用してトランザクションのヒューリスティックな結果を処理す る方法を説明します。

1. トランザクションのヒューリスティックな結果の原因は、リソースマネージャーがコミットま たはロールバックの実行を約束したにも関わらず、約束を守らなかったことにあります。原因 としては、サードパーティーコンポーネント、サードパーティーコンポーネントと JBoss EAP 間の統合レイヤー、または JBoss EAP 自体の問題が考えられます。

ヒューリスティックなエラーの最も一般的な 2 つの原因は、環境での一時的な障害と、リソー スマネージャー対応時のコーディングエラーです。

2. 通常、環境内で一時的な障害が発生した場合は、ヒューリスティックなエラーを発見する前に 気づくはずです。原因としては、ネットワークの停止、ハードウェア障害、データベース障 害、電源異常などが考えられます。

ストレステストの実施中にテスト環境でヒューリスティックな結果が発生した場合は、テスト 環境の脆弱性を意味します。

警告 警告

JBoss EAP は、障害発生時にヒューリスティックな状態ではないトランザ

クションを自動的にリカバリーしますが、ヒューリスティックなトランザ クションのリカバリーは実行しません。

3. 環境に明白な障害が発生していない場合や、ヒューリスティックな結果を簡単に再現できる場 合は、おそらくコーディングエラーが原因です。サードパーティーベンダーに連絡して解決策 があるかどうかを確認する必要があります。

JBoss EAP のトランザクションマネージャー自体に問題があることを疑う場合は、サポートチ

ケットを作成する必要があります。

4. 管理 CLI を使用して手動によるトランザクションのリカバリーを試すことができます。詳細

は、JBoss EAP『Managing Transactions on JBoss EAP』の「Recovering a Transaction Participant」を参照してください。

5. トランザクションの結果を手作業で解決する処理は、障害の正確な状況によって異なります。

環境に合わせて以下の手順を実行します。

a. 関係しているリソースマネージャーを特定します。

b. トランザクションマネージャーとリソースマネージャーの状態を調べます。

c. 関係するコンポーネントの 1 つまたは複数で、ログの消去とデータの照合を手動で強制しま す。

6. テスト環境である場合や、データの整合性を気にしない場合は、トランザクションログを削除

して JBoss EAP を再起動すると、ヒューリスティックな結果はなくなります。デフォルのトラ