環境・条件等をまず示します
動作環境
クライアント 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の仕様として起こりえることでしょうか?
今回この質問に至ったのは、ジョブが複数同時にタイムアウトでエラーした際の確認を通して
このような動きを見つけたからで、仕様かどうかで対策の方法を考えるためです