JTAトランザクションには、ローカルトランザクションとグローバルトランザクションが存在します。複数のリソースに対する処理の一貫性を保証するには、グローバルトランザクションを使用する必要があります。しかし、2フェーズコミットプロトコルによる性能オーバーヘッドがかかるため、できる限り単一のリソースだけを使用するように設計して、ローカルトランザクションを使用することをお勧めします。
ローカルトランザクションには、1つのリソースだけが含まれます。トランザクションの有効範囲は、リソース自体でローカルに管理されます。ローカルトランザクションでは、1フェーズコミットプロトコルが使用されます。また、ローカルトランザクションの場合、1つのプロセス内でトランザクション制御されることを必要とします。
グローバルトランザクションでは、トランザクション内に複数のリソースが登録できます。例えば、グローバルトランザクションは、2つのデータベースを作業範囲とする場合に使用します。また、グローバルトランザクションの場合、複数のプロセス間でトランザクション制御できます。
グローバルトランザクションでは、2フェーズコミットプロトコルが使用されます。
ローカルトランザクションで動作する条件
ローカルトランザクションは1つの非XAリソースだけを含んでおり、トランザクションに参加するJava EEコンポーネントがすべて1つのプロセス内で実行されることを必要とします。1トランザクション範囲内で複数の非XAリソースが使用された場合、トランザクションはエラーとなります。
JDBCリソースが非XAリソースとして扱われる条件は以下です。
JDBC接続プールの定義で、指定したDataSourceクラスがjavax.sql.XADataSourceインタフェースを実装していない場合
JDBC接続プールの定義で、リソースタイプにjavax.sql.XADataSource以外が指定された場合、またはリソースタイプが定義されなかった場合
グローバルトランザクションで動作する条件
複数のリソースを管理するトランザクションまたは複数のプロセス間でトランザクションを管理する場合は、グローバルトランザクションとなります。
トランザクション内で1つのXAリソースだけ使用した場合、リソース間の一貫性を保証する必要がないため1フェーズコミットプロトコルで処理されます。それ以外は、2フェーズコミットプロトコルで動作します。
グローバルトランザクションの制御が必要なケース
同一トランザクション範囲内で以下のようなリソースアクセスが発生した場合に、グローバルトランザクションでの制御が必要となります。
ケース1:複数のリソースマネージャにアクセスする場合
ケース2:メッセージの受信とリソースマネージャにアクセスする場合
ケース3:複数プロセス間でリソースマネージャにアクセスする場合
ケース4:クライアントでトランザクション管理する場合
注意
トランザクション処理は非常に負荷のかかる制御が必要となるため、できる限りサーバ側でトランザクション処理するように設計してください。