1

次のようなコーディング構造の Web ページがあります。

SqlConnection conX =new SqlConnection(blablabla);
conX.Open();
SqlTransaction tran=conX.BeginTransaction();


try{
   SqlCommand cmdInsert =new SqlCommand("INSERT INTO Table1(ColX,ColY) VALUES @x,@y",conX);
   cmdInsert.Transaction=tran;
   cmdInsert.ExecuteNonQuery();

   SqlCommand cmdSelect=new SqlCOmmand("SELECT * FROM Table1",conX);
   cmdSelect.Transaction=tran;
   SqlDataReader dtr=cmdSelect.ExecuteReader();

   //read stuff from dtr
   dtr.Close();

   cmdInsert=new SqlCommand("UPDATE Table2 set ColA=@a",conX);
   cmdInsert.Transaction=tran;
   cmdInsert.ExecuteNonQuery();

   //display MiscMessage
   tran.Commit();
   //display SuccessMessage
}
catch(Exception x)
{
   tran.Rollback();
   //display x.Message
}
finally
{
   conX.Close();
}

そのため、MiscMessage まではすべて機能しているようです。その後、しばらくすると (おそらく 15 秒程度?) x.Message がポップアップ表示され、次のように表示されます。

「タイムアウトが発生しました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。」

私のtrans.Commit()に何か問題がありますか?データベースは更新されていないので、trans.Rollback が機能すると思います...

デッドロックがタイムアウトを引き起こす可能性があることを読みました...この問題は、最初の INSERT ステートメントで使用されている Table1 から選択する SELECT ステートメントが原因ですか? もしそうなら、私は何をすべきですか?それが問題ではない場合、何が問題なのですか?

4

1 に答える 1

0

MiscMessage を表示しているため、トランザクションはまだ開いており、タイムアウトが発生します。トランザクションをコミットし、メッセージを表示します。

于 2012-11-22T05:00:27.400 に答える