环境: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”事务没有立即提交并进入等待直到第一个事务是没有承诺/完成。 ??
如果我没有清楚地描述我的情景,请告诉我。
答案 0 :(得分:1)
我认为这是理由:
“WITH(ROWLOCK)向优化器提供查询提示。如果SQL认为,它仍然可以将行锁升级为页锁或表锁。通常只有在你打一个非常大的时候才会这样做虽然行数 - 它基本上是试图通过几十行锁来节省你的额外资源。“
为列USERID
创建索引(就像Martin Smith所说的那样)可能有所帮助,因为SQL优化器可以使用索引并得出结论,这是完全扫描的行锁定。
答案 1 :(得分:0)
要解决此问题,您需要像已经完成的那样应用“ WITH(ROWLOCK)”,另一件事是,您还需要在USERID上添加“非集群唯一键”索引。
我能够解决此问题,希望也能解决您的问题。