在表中插入行时SQL Server死锁

时间:2010-10-15 18:05:56

标签: asp.net sql-server sql-server-2005 database-deadlocks

sql server deadlock的主题已经讨论了很多次,但是,我不确定即使两个同时插入的表也会陷入死锁状态。

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

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

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

任何建议都会有所帮助。

谢谢, 拉夫

2 个答案:

答案 0 :(得分:3)

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

System.Transactions的隔离级别由IsolationLevel属性控制。

答案 1 :(得分:1)

使用sp_getapplock获取自定义独占锁