0

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

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

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

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

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

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

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

或者只是为了避免死锁。

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

谢谢

4

1 回答 1

0

几点建议:

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

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

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

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

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

于 2013-07-31T20:50:56.987 回答