2

我正在尝试解决有关 SQL 事务(在通过 LINQ-to-SQL 调用的存储过程中)的死锁问题。我使用了 SQL Server Profiler,发现 SP 自身陷入了死锁。

我的客户正在快速连续调用 WCF 方法,该方法又调用导致死锁的 SP。

我已尝试设置所有各种 SQL Server 隔离级别,并尝试设置 WCF ConcurrencyMode = Single。

我仍然有许多死锁“受害者”,因此我丢失了插入数据。

有没有人解决过这种问题?

亲切的问候,尼克V

4

1 回答 1

0

要获取死锁的详细信息,请打开 traceflag 1204。每当发生死锁时,死锁图(包括竞争资源的所有详细信息以及两个进程正在执行的操作)都会写入 SQL 错误日志。这确实有助于发现死锁的情况。

使事务尽可能小。在事务中不要做不必要的工作。永远不要开始交易然后等待用户输入。确保事务中的查询尽可能高效。

以相同的顺序访问对象。如果一个 proc 先更新 tbl1,然后再更新 tbl2,则使用这两个的所有其他 proc 应该以相同的顺序使用它们。做得好,这可以完全防止死锁。

希望有帮助

于 2015-06-26T16:26:58.027 回答