1

环境:SQL SERVER 2008 R2,Windows。

CONNECTION-1:执行以下操作

BEGIN TRANSACTION               

    UPDATE Check_lock with (rowlock)
    set LayoutType = 98
    where USERID between 1 and 7;

    WAITFOR DELAY '000:10:00';

COMMIT TRANSACTION;

CONNECTION-2:执行以下

BEGIN TRANSACTION               

    UPDATE Check_lock with (rowlock)
    set LayoutType = 98
    where USERID between 15 and 20;

COMMIT TRANSACTION;

问题陈述:我通过 SQL Server Management Studio 执行上述事务,同时与同一台机器上的同一服务器/数据库建立两个连接。虽然表是相同的 & 事务同时执行(不是 100% 同时执行,因为手动执行)但是更新不同的行(行级锁定)那么为什么“Conneciton-2”事务没有立即提交并进入等到第一个事务未提交/完成。??

如果我没有清楚地描述我的场景,请告诉我。

4

2 回答 2

1

我认为这是原因:

“WITH (ROWLOCK) 为优化器提供查询提示。如果 SQL 如此认为,它仍然可以将行锁升级为页锁或表锁。通常只有在遇到大量行时才会这样做不过——它基本上是试图通过大量的行锁来让你免于消耗额外的资源。”

这句话取自这个 MSDN 论坛:http ://social.msdn.microsoft.com/Forums/sqlserver/en-US/60238304-04e8-4f98-84d1-3ddf1ed786a9/why-the-entire-table-is-locked -while-with-rowlock-is-used-in-a-update-statement

为列创建索引USERID(如 Martin Smith 所说)可能会有所帮助,因为 SQL 优化器可以使用索引并得出结论,最好是全扫描的行锁。

于 2013-07-09T13:02:45.740 回答
0

要解决这个问题,您需要像已经完成的那样应用“WITH(ROWLOCK)”,另一件事是您还需要在 USERID 上添加“非聚集唯一键”索引。

我能够解决这个问题,并希望也能解决您的问题。

于 2019-03-05T07:19:14.347 回答