none
Transactional NTFSを複数並列実行した場合のTransactionの挙動について RRS feed

  • 質問

  • 環境・条件等をまず示します

    動作環境

    クライアント Windows Server 2008R2
    サーバーA Windows Server 2008R2
    サーバーB Windows Server 2008R2 + SQL Server 2008R2
    サーバーC Windows Server 20012R2


    各サーバーのサービス

    サーバーA
    ・サービスa1:クライアントから呼び出され全体の親Transactionを作成(中でサービスa2、a3、c1を順に実行)
    ・サービスa2:サーバーBのDBのテーブル1に新規データを登録(Transaction使用)
    ・サービスa3:サーバーBのDBのテーブル2に新規データを登録(Transaction使用)

    サーバーC
    ・サービスc1:ローカルディスクにTransactional NTFS(以後TxF)でフォルダを作成
     ローカルディスクは以下のフォルダ構造で新規作成フォルダを作成
     D:\SharedStorage\『新規作成フォルダ名』

    サービスの実行順

    クライアント→サービスa1
    サービスa1で全体のTransactionを開始し、
     サービスa2
     サービスa3
     サービスc1
    の順に実行、最後にTransactionをCommit


    上記構成で実行する際、クライアントから8個のスレッドを作成しサービスa1を並列で開始する
    スレッド間に関連性はなく、コード上、スレッドの待ち合わせのようなものは無し
    DBデータ、ディレクトリ作成は、全てかぶりが発生しない新規データとなっている


    このような形で動作させたとき、処理が進む中で8個のジョブがそれぞれ異なる時間で
    進行していくため、サービスc1が終了する時間にばらつきがでてきますが、
    最後のTransactionのCommit処理が開始するところで、待ち合わせのような状態が発生し、
    最初に到達したジョブのCommit処理がすぐに開始せず、後から遅れてくる何本かが
    Commitまで到達した際、複数本同時にCommit処理が開始する、というような動きをします

    最後に待ち合わせのような動きをする本数は、1本(単独)~8本(全部)という
    いろいろなパターンがあり、常に決まった数の待ち合わせしているわけではありません

    Commit時の開始待ち合わせのような挙動は、TxFを使用しないと発生しません
    このような待ち合わせのような挙動はTxFの仕様として起こりえることでしょうか?

    今回この質問に至ったのは、ジョブが複数同時にタイムアウトでエラーした際の確認を通して
    このような動きを見つけたからで、仕様かどうかで対策の方法を考えるためです

    2016年11月20日 13:04

すべての返信

  • esuwai さん、ご投稿ありがとうございます。
    フォーラム オペレーターの栗下望です。

    Visual Studio 共通 フォーラムではVisual Studio IDE など言語に依存しない共通の話題についてご投稿いただいております。

    そのため、こちらの「Transactional NTFSを複数並列実行した場合のTransactionの挙動について」に関しましては、"Visual Studio 共通 フォーラム"カテゴリよりも"Windows クライアント開発"カテゴリで質問されたほうが情報が集まるのではないかと思われます。

    私のほうで移動させていただきました。

    Msdnフォーラム < Windows クライアント開発

    フォーラム ユーザーからの回答がお役に立ちましたら、投稿者から[回答としてマーク] をよろしくお願いいたします。


    MSDN Community Support 栗下 望


    2016年11月21日 7:40
    モデレータ