两个不同的事务同时更新同一个表的不同行

时间:2013-07-09 09:29:24

标签: sql sql-server rowlocking

环境: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”事务没有立即提交并进入等待直到第一个事务是没有承诺/完成。 ??

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

2 个答案:

答案 0 :(得分: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优化器可以使用索引并得出结论,这是完全扫描的行锁定。

答案 1 :(得分:0)

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

我能够解决此问题,希望也能解决您的问题。