在我当前的应用程序中,我通过调用T-SQL Update命令执行更新。问题是当时其他用户锁定了同一记录。
在.NET应用程序中,应用程序将等待SQL Server超时,然后它将抛出SqlException超时。
是否可以首先检查特定记录是否被其他进程锁定而不是捕获异常?
答案 0 :(得分:23)
不,不是真的。
标准方法是使用try/catch
并处理SqlException
数字1205
(死锁牺牲品),然后重试您的查询:
try
{
// do stuff...
}
catch (SqlException sqlEx)
{
switch (sqlEx.Number)
{
case -2: // Client Timeout
case 701: // Out of Memory
case 1204: // Lock Issue
case 1205: // >>> Deadlock Victim
// handle deadlock
break;
case 1222: // Lock Request Timeout
case 2627: // Primary Key Violation
case 8645: // Timeout waiting for memory resource
case 8651: // Low memory condition
...
}
}
[注意:没有为紧凑性添加break语句
另请注意,通过提供适当的覆盖索引可以消除许多锁定问题。
答案 1 :(得分:0)
你可以使用非常短暂的单独连接来尝试通过更新某些字段来锁定记录,但这仍然不会给你100%的可靠性。
如果你真的遇到多个用户编辑相同记录的情况,你应该研究乐观锁定技术。
此外,请确保您根本不允许用户锁定记录 - 使用断开连接模式进行任何更新。换句话说,锁定仅在短时间更新(<100毫秒)
时发生