SQL Server 2005 密钥死锁

Posted

技术标签:

【中文标题】SQL Server 2005 密钥死锁【英文标题】:SQL Server 2005 deadlock on key 【发布时间】:2008-12-05 22:22:38 【问题描述】:

我有一个在 uniqueidentifier 列上具有聚集主键索引的表。我有一个运行以下伪函数的程序:

begin transaction
read from table 1
insert into table 2
update table 1 with pointer to table 2 record
commit transaction

这一切都很好,直到从其他地方同时执行相同的过程。一旦发生这种情况,每次执行都会在主键上陷入死锁并终止。

除了简单地说“不要同时运行它”之外,我能做些什么来防止这种情况发生吗?事务当前以 READ COMMITTED 隔离级别运行。

【问题讨论】:

【参考方案1】:

    按照 eulerfx.myopenid.com 的提示提高事务隔离级别。

    使用 sql“互斥锁”来简单地等待一个过程完成,然后再允许另一个过程运行。 http://weblogs.sqlteam.com/mladenp/archive/2008/01/08/Application-Locks-or-Mutexes-in-SQL-Server-2005.aspx

    使用快照隔离级别。取决于您的应用程序可以做什么。然而,这带来了其他问题。 http://msdn.microsoft.com/en-us/library/ms189050.aspx

数字 2 需要比 1 更多的代码更改。但有时你不能只提高隔离级别。

【讨论】:

【参考方案2】:

看这里:

http://msdn.microsoft.com/en-us/library/aa213026(SQL.80).aspx

这里:

http://msdn.microsoft.com/en-us/library/aa213039(SQL.80).aspx

【讨论】:

以上是关于SQL Server 2005 密钥死锁的主要内容,如果未能解决你的问题,请参考以下文章

如何消除 SQL Server 2005 中的死锁?

sql server 2005 死锁在生产中超时,而不是在测试环境中:为啥?

sql server2005的死锁

SQL Server 2005 中的死锁!两个实时批量更新正在战斗。为啥?

sqlserver2016密钥更改

sql server2012密钥 用哪个