ページの先頭行へ戻る
Symfoware Server V12.0.0 アプリケーション開発ガイド(.NET Data Provider編)
FUJITSU Software

2.3.4 分散トランザクション

トランザクションスコープにより、暗黙的な分散トランザクションを使用できます。トランザクションスコープを使用する場合、分散トランザクション中のデータ操作は、Windowsのサービスである、Microsoft Distributed Transaction Coordinator(以降、MSDTCと略します)により制御されます。

MSDTCの起動

トランザクションスコープ(System.Transactions 名前空間)を使用する場合、MSDTCサービスを起動しておく必要があります。

Windowsのサービスの一覧で、“Distributed Transaction Coordinator”サービスが開始状態であることを確認してください。

2.3.4.1 アプリケーションの作成方法

トランザクションスコープを使用したアプリケーションの作成方法を説明します。

[アプリケーション作成の流れ]

//1. System.Transactions名前空間導入
using System.Transactions;

//2. トランザクション スコープの開始
using (TransactionScope ts = new TransactionScope())
{
SymfowareConnection con = new SymfowareConnection();
//3. スコープにトランザクションの登録
con.ConnectionString = "DATA SOURCE=127.0.0.1;PORT=26551;" +
                "INITIAL CATALOG=TEST;USER ID=USER01;PASSWORD=PASS01;ENLIST=TRUE";
con.Open();

//4. Closeメソッドの呼び出し
con.Close();

//5. Complete()メソッドの呼び出し
ts.Complete();

//6. トランザクションスコープの終了
}

//7. 終了作業の同期
System.Threading.Thread.Sleep(3000);
  1. アプリケーションにSystem.Transactions名前空間導入

  2. トランザクションスコープの開始

    新しい TransactionScopeオブジェクトを作成すると、トランザクションスコープが開始されます。usingステートメントを使用してスコープを作成することを推奨します。

    TransactionScopeオブジェクトを新規作成する場合、下記の情報を設定できます。詳細は、Microsoft社のMSDNライブラリを参照してください。

    • 入れ子になったスコープとルートスコープの関係設定(既定値:Required)

    • トランザクションスコープのタイムアウトの設定(既定値:60秒)

    • トランザクションスコープの分離レベルの設定(既定値:Serializable)

  3. スコープにトランザクションを登録

    以下の2つの条件を満たす場合、当該コネクションはトランザクションスコープに登録され、当該コネクションのトランザクションがトランザクションスコープマネージャより管理されます。

    • 当該コネクションの接続文字列のEnlistキーワードの値として、trueが設定されている

    • 当該コネクションがトランザクションスコープ内で、SymfowareConnectionのOpen()メソッドを呼び出す

  4. SymfowareConnectionのCloseメソッドの呼び出し

    コネクションを切断する場合、占用した資源を解放するために、当該コネクションのClose()メソッドを呼び出してください。

  5. TransactionScopeオブジェクトのComplete()メソッドの呼び出し

    トランザクションスコープ内ですべての操作を完了したら、TransactionScopeオブジェクトのComplete メソッドを一度だけ呼び出す必要があります。呼び出さない場合、トランザクションがデフォルトで強制終了します。

  6. トランザクションスコープの終了

    トランザクションのコミットおよびロールバックは、トランザクションスコープブロックを終了する際に、当該TransactionScopeオブジェクトのDisposeメソッドを呼び出すことによって実行されます。

  7. アプリケーションとトランザクションスコープの終了作業の同期

    トランザクションスコープの終了作業は、トランザクションスコープマネージャにより、アプリケーションのスレッドとは異なる、新しいスレッドを発行して実行されています。下記の動作を保証するために、アプリケーションで手動同期処理が必要です。

    • トランザクションスコープの終了作業が完了するまでの時間を確保する

    • トランザクションスコープブロック後の作業と並行することを避ける

    手動同期処理では、トランザクションスコープが終了後、数秒間経過してから、アプリケーションをブロックするようにしてください。


サンプルプログラムについては、“A.2.13 TransactionScopeクラスを利用した分散トランザクション制御”または“A.3.13 TransactionScopeクラスを利用した分散トランザクション制御”を参照してください。

2.3.4.2 アプリケーション作成時の注意事項

トランザクションスコープを使用したアプリケーションを作成する場合の注意事項を説明します。

参照

トランザクションスコープ制御の詳細は、Microsoft社のMSDNライブラリの“トランザクション スコープを使用した暗黙的なトランザクションの実装”を参照してください。

2.3.4.3 アプリケーション運用時の注意事項

トランザクションスコープを利用したアプリケーションの運用時に、異常が発生した場合のトランザクションの状態判定および対処方法を説明します。

異常の種類

イムアウト異常

トランザクションスコープ内の処理が、指定されたトランザクションスコープのタイムアウト時間内に終了していない場合、タイムアウト異常が発生します。

インダウト状態異常

トランザクションスコープに登録された複数なトランザクションの一貫性を保証するために、2フェーズコミット制御を行います。1フェーズと2フェーズの間に異常が発生すると、トランザクションの結果として不定の状態(インダウト状態)となり、トランザクションで占用した資源がインダウト閉塞することになります。

インダウト閉塞になると、閉塞が解除されるまで資源はアクセス禁止状態になります。禁止状態の資源をアクセスすると異常が返却されます。この時に返却された異常をインダウト状態異常と呼びます。

トランザクションの状態判定および対処方法

異常の種類ごとに、トランザクションの状態判定および対処方法を説明します。

タイムアウト異常

タイムアウト異常が発生した場合、トランザクションマネージャはTransactionAbortedException をスローします。その結果、トランザクションスコープに登録されたすべての分散トランザクションの実行が中止となり、ロールバックされます。

タイムアウト以外に、以下の場合にも、TransactionAbortedExceptionが発生する可能性があります。

  • トランザクションスコープが終了する時に、トランザクションスコープ内に接続中のコネクションが存在する

  • リソースの競合に関するデッドロックが発生した

インダウト状態異常の判定

インダウトログ状態異常の判定方法を説明します。

サーバ側がLinuxまたはSolarisの場合、インダウトログファイルを利用することでインダウト状態を判定できます。

参照

インダウトログファイルについては、“RDB運用ガイド”を参照してください。

インダウトログファイルがある場合

rdblogコマンドを利用して、インダウトログファイルの状態を確認できます。

インダウトログ状態がactiveの場合、インダウトが発生していることを示します。

参照

インダウトログファイルの状態の表示方法については、“クラスタ導入運用ガイド”の“インダウトログファイルの状態表示”を参照してください。

インダウトログファイルがない場合

以下のいずれかの方法で、インダウト状態を確認できます。

  • RDBREPORTで指定したメッセージログファイルを確認し、以下のエラーメッセージがある場合、インダウトが発生していることを示します。

    qdg13529u:XA配下のトランザクションがインダウト状態になりました
  • RDB システムがダウンし、RDBシステムを再起動するときに、以下のメッセージが出力された場合、インダウトが発生していることを示します。

    qdg12210w:XA配下のインダウトなトランザクションが存在します
インダウト状態の解除

rdbxarcvコマンドを利用して、インダウトトランザクションを解決できます。

参照

rdbxarcvコマンドの指定方法の詳細については、“コマンドリファレンス”を参照してください。