none
TransactionScopeによるトランザクション管理について RRS feed

  • 質問

  • 次の様な、処理を実行した場合、処理が完了(MessageBox表示)するのに少し時間が

    かかります。

     

            private void button1_Click(object sender, EventArgs e)
            {
                using (TransactionScope transaction = new TransactionScope())
                {
                    tableATableAdapter.Update(tableADataSet.TableA);      // A
                    tableBTableAdapter.Update(tableBDataSet.TableB);      // B

                    transaction.Complete();

                    MessageBox.Show("登録完了");
                }
            }

    Formを表示し、最初のボタンクリック時は、1.5秒~2.5秒くらい。

    2回目のボタンクリック(Formは閉じずに)以降は、瞬時に処理は完了します。

     

    Formを閉じ、再度、Formを開くと、やはり、1回目のボタンクリックは時間がかかります。

     

    デバッグ実行すると、「B」の処理に時間がかかっているようなのです。

     

    そこで、「A」の処理をコメント化し「B」の処理だけにした場合は、瞬時に処理は完了します。

     

    これは、何が起こっているのでしょうか?

     

     

    このスレッド内に出てくるお話(分散トランザクション)と関連しているんでしょうか?

    「usingトランザクションを単体のトランザクションでできるようなオプションを作ってほしい」

    http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=1798167&SiteID=7

     

    上記スレッド内で「コンポーネントサービス」と名称が出てきていますが、WindowsVistaでは

    このコンポーネントサービスってどこにあるんでしょうか?(2つ目の質問となってしまいますが)

     

    皆様、ご教授願えますでしょうか。

    宜しくお願い致します。

     

    環境:

    Windows Vista Ultimate

    Visual Studio 2005 Professional Edition SP1

    .NET Framework 2.0

    2007年8月9日 6:45

すべての返信

  • ご質問の件は全くわからないのですが、1つお伝えしたいことがあります。

     

    完了メッセージの表示タイミングを変更されることをおすすめします。
    Complete() ではメモリ内のフラグが立つだけで、実際のデータベースへのコミットは TransactionScope の Dispose() の時点に行われます。
    そのため、完了メッセージの表示は using ブロックの外で行うべきかと思われます。

     

    ところで、TransactionScope を使用しない場合には、書かれた現象は起こらないのですね?
    全然わかってないのですが、分散トランザクションに昇格(の準備?)する際に時間がかかるのでしょうかね。昇格させないための確実な方法は、リンク先に書かれているとおりかと思います…

     

    なお、Vista でのコンポーネントサービスは、dcomcnfg.exe を実行することで確認できるようです。
    (今、Vista の環境がないのでこちらでは試してませんが)

    2007年8月10日 10:28