sql server deadlock的主题已经讨论了很多次,但是,我不确定即使两个同时插入的表也会陷入死锁状态。
方案: 在测试我们的应用程序(SQL Server 2005作为后端,ASP.net 3.5)时,我们同时将记录插入到表中(简化概述),这导致超过70%的用户陷入僵局。 我不知道插件是如何死锁的,因为这不是多个资源的情况。在详细分析(由两个用户重现错误)后,我发现两个进程都在表的主键索引上持有RangeS-S锁,并试图将其转换为RangeI-N锁,这导致了僵局和一项交易被杀死。
问题: 我们可以避免或减少这种死锁,因为这不是资源访问顺序的变化吗?不能'我们强制事务最初获得独占锁定,以便阻止其他进程并避免死锁?可能有什么(不利)影响? 也有人可以解释有关RangeI-N锁的更多信息。
隔离级别为“可序列化”。
任何建议都会有所帮助。
谢谢, 拉夫
答案 0 :(得分:3)
更改您的ADO隔离级别。除非您对Serializable有明确的要求,否则不应使用它。如果您确实使用它,那么您必须清楚地了解其后果,并且由于范围锁定导致的频繁死锁是这些后果之一。
System.Transactions
的隔离级别由IsolationLevel
属性控制。
答案 1 :(得分:1)
使用sp_getapplock获取自定义独占锁