如何在不使用catchexception的情况下从.NET应用程序检测sql server超时
在我当前的应用程序中,我通过调用T-SQL Update命令执行更新。 问题是当时其他用户锁定了同一记录。
在.NET应用程序中,应用程序将等待SQL Server超时,然后它将抛出SqlException超时。
是否可以首先检查特定记录是否被其他进程锁定而不是捕获exception?
不,不是真的。
标准方法是使用try/catch
并处理SqlException
Number 1205
(死锁牺牲品), SqlException
试您的查询:
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语句
另请注意 ,通过提供适当的覆盖索引可以消除许多锁定问题。
您可以使用具有非常短的超时的单独连接来尝试通过更新某些字段来锁定记录,但这仍然不会给您100%的可靠性。
如果您真的遇到多个用户编辑相同记录的情况,您应该研究乐观锁定技术。
此外,请确保您根本不允许用户锁定记录 – 使用断开连接模式进行任何更新。 换句话说,锁定只会在短时间内发生(<100 ms)
- Dictionary :如何使用T作为Func的generics类型?
- 如何从MemoryStream中删除数据
- 在log4Net中关闭记录器实例的正确方法
- 针对ApplicationUser Roles导航属性的ASP MVC Build Throwing Warning?
- 如何使用Razor将文件上传到MVC 3中的App_Data / Uploads后查看文件?
- 如何使用CallerMemberName属性更改ILoggerFacade实现以跟踪调用方法?
- 如何使用文本框在数据网格视图中搜索数据?
- 在c#中捕获特定与通用exception
- 如何在Visual Studio或其他构建工具中的一个C#项目中生成dll和exe的混合?