【问题标题】:Strange Locking Behaviour in SQL Server 2005SQL Server 2005 中的奇怪锁定行为
【发布时间】:2011-06-20 09:11:21
【问题描述】:

谁能告诉我为什么给定存储过程中的以下语句会返回重复的结果,即使第一条SELECT语句使用的行被锁定?

BEGIN TRANSACTION

DECLARE @Temp TABLE ( ID INT )

INSERT INTO @Temp SELECT ID FROM SomeTable WITH (ROWLOCK, UPDLOCK, READPAST) WHERE SomeValue <= 10
INSERT INTO @Temp SELECT ID FROM SomeTable WITH (ROWLOCK, UPDLOCK, READPAST) WHERE SomeValue >= 5

SELECT * FROM @Temp

COMMIT TRANSACTION

SomeTableSomeValue 介于 5 和 10 之间的任何值都将返回两次,即使它们被锁定在第一个 SELECT 中。我认为整个事务的锁都到位了,所以我没想到查询会返回重复的结果。为什么会这样?

【问题讨论】:

    标签: sql-server-2005 locking


    【解决方案1】:

    在同一个会话/事务中,READPAST 不会有任何作用。

    因此,即使您有第一个 SELECT 的 ROWLOCK 和 UPDLOCK ,下一个 SELECT 也会忽略这些。如果第二个 SELECT 是不同的会话,那么它会按预期工作。

    更多信息请参见:ORDER BY and WITH(ROWLOCK, UPDLOCK, READPAST)TABLOCKX versus SERIALIZABLE

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多