Sql 两个不同的事务同时更新同一表的不同行
环境:SQL SERVER 2008 R2,Windows 连接1:执行以下操作Sql 两个不同的事务同时更新同一表的不同行,sql,sql-server,rowlocking,Sql,Sql Server,Rowlocking,环境:SQL SERVER 2008 R2,Windows 连接1:执行以下操作 BEGIN TRANSACTION UPDATE Check_lock with (rowlock) set LayoutType = 98 where USERID between 1 and 7; WAITFOR DELAY '000:10:00'; COMMIT TRANSACTION; BEGIN TRANSACTION
BEGIN TRANSACTION
UPDATE Check_lock with (rowlock)
set LayoutType = 98
where USERID between 1 and 7;
WAITFOR DELAY '000:10:00';
COMMIT TRANSACTION;
BEGIN TRANSACTION
UPDATE Check_lock with (rowlock)
set LayoutType = 98
where USERID between 15 and 20;
COMMIT TRANSACTION;
连接2:执行以下操作
BEGIN TRANSACTION
UPDATE Check_lock with (rowlock)
set LayoutType = 98
where USERID between 1 and 7;
WAITFOR DELAY '000:10:00';
COMMIT TRANSACTION;
BEGIN TRANSACTION
UPDATE Check_lock with (rowlock)
set LayoutType = 98
where USERID between 15 and 20;
COMMIT TRANSACTION;
问题陈述:我正在通过SQLServerManagementStudio执行上述事务,方法是同时在同一台计算机上与同一服务器/数据库建立两个连接。 虽然表是相同的&事务在同一时间执行(不是100%相同的时间,因为手动执行),但更新不同的行(行级锁定),那么为什么“Conneciton-2”事务没有立即提交,而是等待第一个事务未提交/完成
如果我没有清楚地描述我的情况,请告诉我。我想这就是原因: WITH(ROWLOCK)向优化器提供查询提示。如果SQL这样认为,它仍然可以将ROWLOCK升级为页面锁或表锁。通常只有在您遇到大量行时才会这样做-它基本上是为了避免您通过大量行锁消耗额外资源 此引文摘自本MSDN论坛:
为列
USERID
(如Martin Smith所说)创建一个索引可能会有所帮助,因为SQL优化器可以使用该索引并得出结论:行锁最好,而不是完全扫描。我认为这就是原因:
WITH(ROWLOCK)向优化器提供查询提示。如果SQL这样认为,它仍然可以将ROWLOCK升级为页面锁或表锁。通常只有在您遇到大量行时才会这样做-它基本上是为了避免您通过大量行锁消耗额外资源
此引文摘自本MSDN论坛:
为列
USERID
(如Martin Smith所说)创建一个索引可能会有所帮助,因为SQL优化器可以使用该索引并得出结论,即行锁是进行完整扫描的最佳方式。要解决这个问题,您需要像已经做的那样应用“WITH(ROWLOCK)”,另一件事是您还需要添加一个用户ID上的“非聚集唯一键”索引
我能够用这个解决死锁问题,希望也能解决您的问题。要解决这个问题,您需要像已经做的那样应用“with(ROWLOCK)”,另一件事是您还需要在USERID上添加一个“Non-Clustered Unique Key”索引
我可以用它解决死锁问题,希望也能解决您的问题。欢迎使用SO,您应该在问题中添加SQL标记,避免将电子邮件地址放在问题正文中(您可以将其添加到您的个人资料中!)
USERID
是否已索引?执行计划中是否使用了索引?如果没有,则在等待读取第一个事务以独占方式锁定的行时,将阻止扫描以查找与USERID在15和20之间匹配的行。为什么要将代码“WAITFOR DELAY'000:10:00';“欢迎使用SO,您应该在问题中添加SQL标记,并避免将电子邮件地址放在问题正文中(您可以将其添加到您的个人资料中!)USERID
是否已索引?执行计划中是否使用了索引?如果没有,则在等待读取第一个事务以独占方式锁定的行时,将阻止扫描以查找与USERID在15和20之间匹配的行。为什么要将代码“WAITFOR DELAY'000:10:00';"