検索

12.3.2. 1 フェーズコミット (1PC) の LRCO 最適化

download PDF
トランザクションでは、2 フェーズコミットプロトコル (2PC) がより一般的に使用されますが、両フェーズに対応する必要がなかったり、対応できない場合もあります。そのような場合、1 フェーズコミット (1PC) プロトコルを使用できます。これが発生する可能性のある状況の 1 つは、XA に対応していないデータソースがトランザクションに参加する必要がある場合です。
このような状況では、Last Resource Commit Optimization (LRCO) と呼ばれる最適化が採用されます。単一フェーズのリソースは、トランザクションの準備フェーズの最後に処理され、コミットが試行されます。コミットが成功すると、トランザクションログが書き込まれ、残りのリソースは 2PC を経由します。最終リソースがコミットに失敗すると、トランザクションはロールバックされます。
このプロトコルにより、ほとんどのトランザクションは正常に完了しますが、一部のエラーによってトランザクションの結果の一貫性が失われることがあります。そのため、この方法は最終手段として使用してください。
ローカルの TX データソースが 1 つのみトランザクションで使用されると、LRCO が自動的に適用されます。

12.3.2.1. Commit Markable Resource (CMR)

概要

Commit Markable Resource (CMR) インターフェイスを介してリソースマネージャーへのアクセスを設定すると、1PC リソースマネージャーを 2PC トランザクションに確実に参加させることができます。これは、非 XA リソースを完全にリカバリー可能にする LRCO アルゴリズムの実装です。

以前は、1PC リソースを 2PC トランザクションに追加することは、LRCO 方式を介して実現されていましたが、LRCO には失敗のウィンドウがあります。LRCO メソッドを介して 1PC リソースを 2PC トランザクションに追加するには、以下の手順に従います。
  1. 2PC を準備する
  2. LRCO をコミットします。
  3. tx ログを書き込む
  4. 2PC をコミットする
手順 2 と手順 3 の間に手順がクラッシュした場合、2PC をコミットすることはできません。CMR はこの制限を取り除き、1PC を 2PC トランザクションに確実に参加させることができます。
注記
データソース設定で exception-sorter パラメーターを使用します。JBoss EAP 『管理および設定ガイド』 に記載されているデータソース設定例に従うことができます。

制約

トランザクションには、CMR リソースを 1 つだけ含めることができます。

前提条件

次の SQL が機能するテーブルを作成する必要があります。

SELECT xid,actionuid FROM _tableName_ WHERE transactionManagerID IN (String[])
DELETE FROM _tableName_ WHERE xid IN (byte[[]])
INSERT INTO _tableName_ (xid, transactionManagerID, actionuid) VALUES (byte[],String,byte[])

例12.1 SQL クエリーのいくつかの例

Sybase:
CREATE TABLE xids (xid varbinary(144), transactionManagerID varchar(64), actionuid varbinary(28))
Oracle:
CREATE TABLE xids (xid RAW(144), transactionManagerID varchar(64), actionuid RAW(28))
CREATE UNIQUE INDEX index_xid ON xids (xid)
IBM:
CREATE TABLE xids (xid VARCHAR(255) for bit data not null, transactionManagerID
varchar(64), actionuid VARCHAR(255) for bit data not null)
CREATE UNIQUE INDEX index_xid ON xids (xid)
SQL Server:
CREATE TABLE xids (xid varbinary(144), transactionManagerID varchar(64), actionuid varbinary(28))
CREATE UNIQUE INDEX index_xid ON xids (xid)
Postgres:
CREATE TABLE xids (xid bytea, transactionManagerID varchar(64), actionuid bytea)
CREATE UNIQUE INDEX index_xid ON xids (xid)

リソースマネージャーを CMR として有効にする

デフォルトでは、CMR 機能はデータソースに対して無効になっています。有効にするには、データソースの設定を作成または変更し、connectable 属性を true に設定する必要があります。サーバー xml 設定ファイルの datasources セクションの設定エントリーの例は次のとおりです。

<datasource enabled="true" jndi-name="java:jboss/datasources/ConnectableDS" pool-name="ConnectableDS" jta="true" use-java-context="true" spy="false" use-ccm="true" connectable="true"/>
注記
この機能は XA データソースには適用されません。
次のように、CLI を使用して CMR としてリソースマネージャーを有効にすることもできます。
/subsystem=datasources/data-source=ConnectableDS:add(enabled="true", jndi-name="java:jboss/datasources/ConnectableDS", jta="true", use-java-context="true", spy="false", use-ccm="true", connectable="true", connection-url="validConnectionURL", exception-sorter="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLExceptionSorter", driver-name="h2")

新しい CMR 機能を使用するために既存のリソースを更新

新しい CMR 機能を使用するために既存のリソースを更新するだけでよい場合は、接続可能な属性を変更するだけです。

/subsystem=datasources/data-source=ConnectableDS:write-attribute(name=connectable,value=true)

CMR 対応のデータソースの特定

トランザクションサブシステムは、以下に示すように、トランザクションサブシステム設定セクションへのエントリーを通じて CMR 対応のデータソースを識別します。

<subsystem xmlns="urn:jboss:domain:transactions:3.0">
    ...
    <commit-markable-resources>
        <commit-markable-resource jndi-name="java:jboss/datasources/ConnectableDS">
            <xid-location name="xids" batch-size="100" immediate-cleanup="false"/>
        </commit-markable-resource>
        ...
    </commit-markable-resources>
</subsystem>
注記
CMR を追加した後、サーバーを再起動する必要があります。
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.