【问题标题】:Timeout when trying to Transaction.Commit() to database; potential deadlock?尝试将 Transaction.Commit() 发送到数据库时超时;潜在的僵局?
【发布时间】:2012-11-10 11:07:36
【问题描述】:

我有一个网页,其编码结构如下:

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 可以工作......

我已经读到死锁会导致超时...这个问题是由我的 SELECT 语句从第一个 INSERT 语句使用的 Table1 中选择引起的吗? 如果是这样,我该怎么办?如果这不是问题,那是什么?

【问题讨论】:

    标签: c# transactions timeout commit deadlock


    【解决方案1】:

    因为您显示 MiscMessage,您的事务仍然打开,然后超时到期。提交事务,然后显示消息。

    【讨论】:

    • 哇,谢谢!这就是问题所在!那还有一些在 .Commit() 之前完成的 .DataBind()! XD
    猜你喜欢
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 2014-02-26
    • 1970-01-01
    • 2021-05-31
    相关资源
    最近更新 更多