分散トランザクションのトラブルシューティング
-
セマフォ待機
-
ラッチ待機
-
I/Oイベント
-
参加者のないオープン・トランザクション
-
長時間実行されている操作
TimesTen Scaleoutでは、これらのケースがまだ該当し、さらに別のケースである可能性もあります。要素に障害が発生すると、その要素から開始されたすべてのトランザクションでは、トランザクション・マネージャが失われています。リモート参加者は、準備レスポンスの送信後にトランザクションのコミットの決定を受信しなかった場合、インダウトになったトランザクションをコミットまたはロールバックするのを待機する必要があります。また、準備レスポンスを送信した後、コミットの決定を受け取る前に参加者に障害が発生した場合、トランザクションは障害が発生した参加者のインダウト・トランザクションになります。
グローバル・トランザクションID
グローバル・トランザクションIDは、データベースのすべての要素にわたるトランザクションを一意に識別します。グローバル・トランザクションIDは、次のパラメータで構成されます。
-
トランザクション・マネージャの要素ID
-
トランザクション・マネージャの接続IDまたはローカル・トランザクションID
-
接続から発行されたトランザクションのカウンタ
次の例では、トランザクションを発行する接続内からグローバル・トランザクションIDを取得する方法を示しています。SYS.V$XACT_ID
システム・ビューには、トランザクションのグローバル・トランザクションIDを作成するために必要なすべてのパラメータが格納されます。
Command> autocommit 0;
Command> INSERT INTO transactions VALUES (txn_seq.NEXTVAL, 342, SYSDATE, NULL, 'A', 8.33);
1 row inserted.
Command> SELECT elementId, xactId, counter FROM sys.v$xact_id;
< 3, 1, 148 >
1 row found.
SYS.V$XACT_ID
システム・ビューの詳細は、『Oracle TimesTen In-Memory Databaseシステム表およびビュー・リファレンス』のSYS.V$XACT_IDを参照してください。
インダウト・トランザクションの管理
TimesTen Scaleoutは、要素のリカバリ中にインダウト・トランザクションを自動的に解決します。トランザクションのコミットの準備ログ・レコードには、他の参加者に関する情報が含まれます。インダウト・トランザクションを解決するために、リカバリ要素は、コミットの準備ログ・レコードにリストされているいずれかの参加者からのコミットの決定をリクエストします。
トランザクション・マネージャに障害が発生した場合、TimesTen Scaleoutは、各書込みレプリカ・セットの1つの参加者が使用可能である場合はインダウト・トランザクションを解決できます。ただし、どの参加者にもコミットの決定がなく、すべての書込みレプリカ・セットが使用可能というわけではない場合、TimesTen Scaleoutは、インダウト・トランザクションを解決できません。TimesTen Scaleoutがインダウト・トランザクションを解決できなかった場合は、ttXactAdmin
ユーティリティを使用して、トランザクションのコミットまたはロールバックを強制します。
ノート:
ほとんどの場合、未解決のインダウト・トランザクションは常にロールバックする必要があります。ただし、トランザクションを外部からコミットする場合は、一貫性のあるデータベースを保証するために、使用不可の参加レプリカを除去する必要があります。レプリカ・セットの除去は、レプリカ・セットに格納されたすべてのデータが失われることを意味します。「レプリカ・セットに永続的な障害が発生した要素がある場合のリカバリ」を参照してください。
ttXactAdmin
ユーティリティを使用してすべての未処理トランザクションのstate
を確認できます。これについては、「すべての未処理トランザクションの状態の確認」を参照してください。トランザクションのstate
がin-doubt
である場合は、同じユーティリティを使用してトランザクションを外部からコミットまたはロールバックできます。これについては、それぞれ「インダウト・トランザクションのコミット」または「インダウト・トランザクションのロールバック」を参照してください。
ttXactAdmin
ユーティリティの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttXactAdminを参照してください。
すべての未処理トランザクションの状態の確認
この例は、コマンドを実行しているデータ・インスタンスの要素が参加者であるすべての未処理トランザクションのステータスを取得する方法を示しています。ttXactAdmin
ユーティリティは、コマンドを実行しているデータ・インスタンスの要素に関連する情報のみを取得します。
% ttXactAdmin -connStr "DSN=database1"
2016-12-14 11:00:36.995
/disk1/databases/database1
TimesTen Release 22.1.1.27.0
ElementID 3
Program File Name: _ttIsql
XactID PID Context State Loghold Last ID
3.1.148 26247 0x13b3ff0 Active -1.-1 [-1:2]
Resource ResourceID Mode SqlCmdID Name
Database 0x01312d0001312d00 IX 0
HashedKey ffffffffe5a341d5 SF 284478280 PAT.ACCOUNTS
Table 2367304 IRC 284478280 PAT.ACCOUNTS
EndScan AAAVVUAAAA9AAAAGjO En 284478280 PAT.TRANSACTIONS
Table 2367320 IRC 284478280 PAT.TRANSACTIONS
Begin Time: 10:59:21.695
インダウト・トランザクションのコミット
この例では、ttXactAdmin
ユーティリティを使用して、トランザクション3.1.148をコミットします。このコマンドは、トランザクション・マネージャが停止しており、そのレプリカ・セットがデータベースから除去された場合にのみ正常に実行されます。障害が発生したレプリカ・セットを除去する時期と方法の詳細は、「停止しているレプリカ・セットからのリカバリ」を参照してください。
% ttXactAdmin -connStr "DSN=database1" -xactIdCommit 3.1.148