【问题标题】:SQL Server Deadlock within WCFWCF 中的 SQL Server 死锁
【发布时间】:2013-08-22 21:23:22
【问题描述】:

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

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

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

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

有人解决过这种问题吗?

亲切的问候, 尼克V

【问题讨论】:

  • 解决方案将在您的存储过程的设计中。可以发一下代码吗?
  • 当您遇到死锁异常时,您应该在异常处理程序中重试事务。虽然我同意 Paul Keister 的观点,但问题可能出在存储过程中,您需要在代码中优雅地处理死锁。以 500 毫秒的延迟重试事务将比丢失数据更优雅一些。

标签: sql-server wcf deadlock


【解决方案1】:

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

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

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

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多