1

sql server 死锁这个话题已经讨论过很多次了,但是我不确定即使是在一个表上同时插入两个操作也会导致死锁。

场景:在测试我们的应用程序(SQL Server 2005 作为后端,ASP.net 3.5)时,我们同时将记录插入到表中(简化概述),这导致超过 70% 的用户出现死锁。我无法理解插入是如何陷入死锁的,因为这不是多个资源的情况。经过详细分析(由两个用户重现错误)后,我发现两个进程都在表的主键索引上持有 RangeS-S 锁,并试图将其转换为 RangeI-N 锁,这导致了死锁和一个事务被杀死。

问题:我们能否避免或减少这种死锁,因为这不是资源访问顺序的改变?我们不能'我们强制事务最初获得排他锁以阻止其他进程并避免死锁吗?可能产生什么(不利)影响?也有人可以解释更多关于 RangeI-N 锁的信息。

隔离级别为“可序列化”。

任何建议都会有所帮助。

谢谢,高拉夫

4

2 回答 2

2

更改您的 ADO 隔离级别。除非你对 Serializable 有明确的要求,否则你不应该使用它。如果你确实使用它,那么你必须清楚地了解后果,而由于范围锁导致的频繁死锁就是这些后果之一。

的隔离级别System.TransactionsIsolationLevel属性控制。

于 2010-10-15T18:28:35.560 回答
1

使用 sp_getapplock 获取自定义排他锁

于 2010-10-15T19:50:31.163 回答