Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 两个不同的事务同时更新同一表的不同行_Sql_Sql Server_Rowlocking - Fatal编程技术网

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

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

环境: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               

    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';"