为什么在更新语句中使用"with(rowlock)"时整个表被锁定

van*_*ani 6 t-sql database sql-server

我使用WITH(ROWLOCK)更新表的一行,但通过执行"sp_lock",我可以看到整个表被锁定.因此,在提交事务之前,其他事务无法更新表的其他行.为什么"WITH(ROWLOCK)"没有生效?

我正在使用以下查询与rowlock:

DELETE FROM DefDatabaseSession  WITH (ROWLOCK) WHERE ProcessName='test';
Run Code Online (Sandbox Code Playgroud)

同时从同一个表中的差异行运行相同删除操作的任何其他事务中我得到异常

[SQLServer JDBC Driver] [SQLServer]超出锁定请求超时时间.嵌套异常是java.sql.SQLException:[newscale] [SQLServer JDBC Driver] [SQLServer]超出锁定请求超时时间:com.newscale.bfw.udkernel.kernel.UdKernelException:udconfig.defdbsession.delete; 未分类SQL的SQLException [DELETE FROM DefDatabaseSession WHERE ProcessName =?]; SQL状态[HY000]; 错误代码[1222]; [newscale] [SQLServer JDBC Driver] [SQLServer]超出锁定请求超时时间.嵌套异常是java.sql.SQLException:[newscale] [SQLServer JDBC Driver] [SQLServer]超出锁定请求超时时间.

Lok*_*esh 2

这里的原因是优化器忽略了行锁提示[WITH (ROWLOCK) 向优化器提供查询提示]。这种情况会发生在您遇到大量行的情况下,在这种情况下,优化器发现对表进行堆扫描并因此获得表锁更可行。

有关详细讨论,您可以访问此链接:http://social.msdn.microsoft.com/Forums/sqlserver/en-US/60238304-04e8-4f98-84d1-3ddf1ed786a9/why-the-entire-table-is -在更新语句中使用带行锁时锁定