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 死锁在生产中超时,而不是在测试环境中:为啥?