Question

K.Komatsu on Sat, 02 Nov 2019 07:52:21


お世話になります。

正常に動作している[異なるサーバーのテーブルに対して分散トランザクションを利用してデータを更新するプログラム]を新環境で動作させたところ、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();
}

Replies

Haruka6002 on Wed, 06 Nov 2019 07:48:23


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

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

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

Haruka6002 on Fri, 08 Nov 2019 05:41:16


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秒後にエラーが発生します。

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