分散トランザクションのトラブルシューティング

TimesTen Classicでは、トランザクションが別のトランザクションによって保持されているリソースを待機する必要がある場合があります。リソースはロックで保護されている場合、トランザクションはロックが解放されるまで待機します。他のトランザクションがデータ・ロックとして示されていない外部イベントを待機している可能性があるため、デッドロック検出によって問題が解決されません。トランザクションが待機する原因となる可能性があるリソースは、次のとおりです。
  • セマフォ待機

  • ラッチ待機

  • 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を確認できます。これについては、「すべての未処理トランザクションの状態の確認」を参照してください。トランザクションのstatein-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

インダウト・トランザクションのロールバック

この例では、ttXactAdminユーティリティを使用して、トランザクション3.1.148をロールバックします。

% ttXactAdmin -connStr "DSN=database1" -xactIdRollback 3.1.148