【发布时间】:2010-12-06 12:44:03
【问题描述】:
我在 asp.net 2.0 上有一个大型 Web 应用程序。 用户在那里打开对象编辑器并进行一些更改。他们不能同时打开同一个对象。
在他们按下“保存”按钮后,所有更改过程都会通过回发保存在服务器上。
我正在使用事务进行保存。保存操作OK前还有很多程序、检查等。
using (SqlConnection con = .........)
{
SqlTransaction trans = null;
try
{
con.Open();
trans=con.BeginTransaction(IsolationLevel.ReadUncommitted);
........operations.........
trans.Commit();
}
catch (Exception e)
{
try { if (trans != null) trans.Rollback(); }
catch { }
throw new MyException("SQL Exception: " + e.Message, e);
}
finally
{
if (con != null && con.State == ConnectionState.Open) con.Close();
}
}
对我来说,这段代码很安全。
但定期发生: 此 Web 应用程序中有关在 mssql 上保存操作的一个进程变为“睡眠/等待”。 其他用户调用的其他进程被此进程锁定并组织一个队列。
其中一个抛出了超时异常.....但其他人正在等待。
所以,我的问题是:我的代码是否有一些错误操作导致命令进入休眠/等待状态? 会不会有什么技巧?
【问题讨论】:
-
你显然省略了代码来缩短你的代码示例,所以可能是因为这个,但我在你的代码中的任何地方都没有看到 trans.Commit() 调用?
-
try { if (trans != null) trans.Rollback(); }后面的空catch块的作用是什么。想知道这是否掩盖了一些错误。
标签: asp.net sql-server transactions locking sleep