none
MSDTCをファイアウォールでブロックされている時のタイムアウト時間について RRS feed

  • 質問

  • お世話になります。

    正常に動作している[異なるサーバーのテーブルに対して分散トランザクションを利用してデータを更新するプログラム]を新環境で動作させたところ、MSDTC(分散トランザクションコーディネーター)をファイアウォールの許可プログラムに設定し忘れて、エラーが発生しました。その後、許可プログラムに設定すると新環境でも正常に動作するようになりました。

    ただ一点腑に落ちない点があり、そのプログラムは対象のテーブルに一行追加するだけのシンプルなもので通常は1秒も掛からずに処理を終え、使用している[SqlCommand]もタイムアウトを10秒に設定している(接続を遮断して実行すると10秒後にエラーが発生することを確認)のにも関わらず、今回のようにファイアウォールでブロックされている場合は実行開始から数分後にエラーが発生しました。また確認するごとにエラー発生までの時間は変化します。

    できればこのエラーのタイムアウト時間を設定できればいいのですが、何か方法はないでしょうか?よろしくおねがいします。

    SqlConnection conDB1 = new SqlConnection(Properties.Settings.Default.DbKomatsuConnectionString);
    SqlConnection conDB2 = new SqlConnection(Properties.Settings.Default.DbKomatsuConnectionString2);
    SqlCommand com = new SqlCommand("INSERT INTO TbSeq VALUES ('Check MSDTC');");
    
    com.CommandTimeout = conDB1.ConnectionTimeout;
    
    using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromSeconds(com.CommandTimeout)))
    {
        conDB1.Open();
        conDB2.Open(); //***ここでエラー発生***
    
        com.Connection = conDB1;
        com.ExecuteNonQuery();
    
        com.Connection = conDB2;
        com.ExecuteNonQuery();
    
        ts.Complete();
    }

    2019年11月2日 7:52

すべての返信

  • K.Komatsuさん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    ご質問いただいた件ですが、その後いかがでしょうか。
    追加でご確認いただいたことなどあれば、追記いただくことで回答がつきやすくなります。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2019年11月6日 7:48
    モデレータ
  • K.Komatsuさん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    ご説明によると、Sqlconnectionのタイムアウトを設定します。
    Sqlcommand.timeoutは、Sqlconnectionの代わりにsqlcommandのタイムアウトを設定するために使用されるとのことです。
    次のコードを試して、sqlconnectionのタイムアウトを設定できます。
     SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(@"connectionstring");
                builder.ConnectTimeout = 10;
                SqlConnection conDB1 = new SqlConnection(builder.ToString());
                SqlCommand com = new SqlCommand("INSERT INTO TbSeq VALUES ('Check MSDTC');");
                using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromSeconds(com.CommandTimeout)))
                {
                    conDB1.Open();
                    ts.Complete();
                }

    私はそれをテストしました。 接続文字列に問題がある場合、10秒後にエラーが発生します。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2019年11月8日 5:41
    モデレータ