Sql server SQL Server 2008死锁问题
我陷入了一个死锁问题,我正在努力寻找根本原因…死锁图表明UPDATE语句成为SELECT语句的牺牲品。。。 让我困惑的是UPDATE语句正在试图获取UPDATE语句中从未引用过的其他表的索引 这就是我的UPDATE语句的样子Sql server SQL Server 2008死锁问题,sql-server,tsql,deadlock,Sql Server,Tsql,Deadlock,我陷入了一个死锁问题,我正在努力寻找根本原因…死锁图表明UPDATE语句成为SELECT语句的牺牲品。。。 让我困惑的是UPDATE语句正在试图获取UPDATE语句中从未引用过的其他表的索引 这就是我的UPDATE语句的样子 UPDATE Table set col1 = @P1 where col2 = @P2 此语句在col2索引上获取了一个X锁,但也尝试在与UPDATE语句无关的其他表中定义的列上获取索引 赢得死锁情况的SELECT语句与update语句中的表或索引无关,而是试图在u
UPDATE Table set col1 = @P1 where col2 = @P2
此语句在col2索引上获取了一个X锁,但也尝试在与UPDATE语句无关的其他表中定义的列上获取索引
赢得死锁情况的SELECT语句与update语句中的表或索引无关,而是试图在update语句中的表上获取索引。最终导致死锁。更新事务/锁将包括以下内容:
- 触发
- 外键验证(col1是fk吗?)
- 检查约束(在col1上使用udf)
- 索引视图(使用table.col1或table.col2)
其中任何一个都可能导致明显不相关的表具有锁,更新事务/锁将包括以下内容:
- 触发
- 外键验证(col1是fk吗?)
- 检查约束(在col1上使用udf)
- 索引视图(使用table.col1或table.col2)
除了这些优秀的答案之外,任何一个都可能导致明显无关的表有一个锁
,要考虑的是一个选择通常会获得一个共享的读锁,它允许一系列的选择来维护资源上的共享锁。update语句可能永远没有机会被授予独占锁。通常情况下,虽然引擎在防止这种饥饿方面做得很好,但是如果您在事务中使用另一条语句的更新,那么这可能会使问题复杂化。如果是这种情况,则提供事务中发生的更多细节。 < P>除了其他优秀的答案之外,要考虑的是一个选择通常会获得一个共享的读锁,它允许一系列的选择来维护资源上的共享锁。update语句可能永远没有机会被授予独占锁。通常情况下,虽然引擎在防止这种饥饿方面做得很好,但是如果您在事务中使用另一条语句的更新,那么这可能会使问题复杂化。如果是这种情况,请提供事务中发生的情况的详细信息。您可能需要检查约束和依赖关系。更新锁定的表可能具有约束或触发器,或者在修改更新表时对其进行修改。您可能需要检查约束和依赖项。更新锁定的表可能有一个约束或触发器,或者在修改更新表时对其进行修改。第一句话描述了一个“livelock”或+1 Nice链接。在某些情况下,这些检测机制将失败,您必须添加锁定提示。例如,一个事务包含一个select,然后是一个update(共享锁试图被ugpraded为exclusive),因此您需要添加一个查询提示,以使select语句从get-go获取一个独占锁。第一句话描述了一个“livelock”或+1 Nice链接。在某些情况下,这些检测机制将失败,您必须添加锁定提示。例如,一个事务包含一个select,然后是一个update(共享锁试图被ugpraded为exclusive),因此您需要添加一个查询提示,以使select语句从get go中获得一个exclusive锁。