当 SQL 命令的CommandTimeout
到期时,是否保证立即终止该命令?
也就是说,当正在执行的 SQL 在数据库中处于"死锁"状态时,CommandTimeout 是否会终止命令?
在这种情况下,"死锁"实际上可能是一个活锁,无法从SQL Server检测到;因此引号。在代码中,命令失败将导致关闭连接。
我最近遇到了一个类似的问题。无论引发 CommandTimeout 异常的 C# 代码如何,死锁都可能保持不变。我相信有一个取消事件信号从您的 C# 应用程序层发送到数据库,表明命令超时并且查询应该中止,但由数据库来清除死锁。这可能需要一些时间,具体取决于必须回滚的事务数量等(您可以随时尝试杀死死锁的SPID,但我会非常小心,因为这可能会导致一些问题,而不会给您任何错误日志来找出出了什么问题。
如果您正在使用事务并且经常超时,则可以考虑使用 SET XACT_ABORT ON
。
我认为问题是为什么它陷入僵局?您可以使用exec SP_WHO2
来查看被锁定的内容,或者运行 SQL 事件探查器/跟踪来查看罪魁祸首。