【问题标题】:SQL Server 2005 frequent deadlocksSQL Server 2005 频繁死锁
【发布时间】:2013-07-31 19:27:08
【问题描述】:

我们有一个使用 ASP.NET 4.0 (C#) 构建的 Web 应用程序,并且我们使用 SQL Server 2005 作为后端。

应用程序本身是一个工作流引擎,其中每条记录都由 4 个角色持有者在一个月内 18 天内证明。

我们大约有 20 万条记录,每个月的 1 日都有。

在 18 天内 - 有些人正在查看和证明记录,而系统管理员可能正在更改这些记录的所有权。

我的问题或担心是我们经常在数据库中遇到死锁问题。

一些用户可能在他们的小猫中有 10000 条记录,他们试图一次性证明所有记录,而系统管理员也可能为几千条记录批量更改所有权,此时我们会陷入僵局,即使两个或更多用户使用大量帐户试图证明 - 我们陷入僵局。

我们在事务中广泛使用存储过程。有没有办法为这种情况编写代码?

或者只是为了避免死锁。

很抱歉以如此随意的方式提问,但欢迎提供任何提示或提示,如果您需要更多信息来理解问题,请告诉我。

谢谢

【问题讨论】:

    标签: asp.net sql-server deadlock


    【解决方案1】:

    一些建议:

    1) 使用相同的顺序从表中读取/写入数据。

    示例 #1(读写死锁):避免创建从 A 读取然后写入 B 的存储过程 usp_ReadA_WriteB 以及从 B 读取然后写入 A 的另一个存储过程 usp_ReadB_WriteA。阅读此@ 987654321@请。

    示例#2(写-写死锁):避免创建一个存储过程usp_WriteA_WriteB将数据写入表A,然后再写入表B,以及另一个存储过程usp_WriteB_writeA将数据写入相同的表:表B和然后进入表A。

    2) 最小化交易的持续时间。最小化受影响的行以减少锁的数量。请注意lock escalation 的 5000 锁阈值。

    3) 优化您的查询。例如:在执行计划中查找[Clustered]{Index|Table}Scan{Key|RID} LookupSort 运算符。使用索引,但也要尽量减少索引的数量并尽量减少每个索引的大小(首先尝试最小化索引键的大小)。请阅读此blog post

    【讨论】:

    • 辉煌;感谢您的建议 - 让我阅读一下。
    • 另外两件事:4) 在事务期间,您必须排除任何 UI 交互(因此,避免start transaction, wait for user input, insert data, finish transaction)。 5)如果您有影响许多行的长事务,您可以将这些行存储到表变量中并在事务结束时执行最终数据修改(例如 'BEGIN TRAN;...INSERT INTO @TableVarA SELECT...FROM 。 ..UPDATE @TableVarA...INSERT INTO @TableVarB...DELETE @TableVarB...INSERT dbo.TableA SELECT FROM @TableVarA;UPDATE dbo.TableB SET...FROM @TableVarB;COMMIT;')。我使用了这个解决方案,效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多