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

标签 sql-server database tsql

我使用 WITH (ROWLOCK) 更新了表的一行,但是通过执行“sp_lock”我可以看到整个表都被锁定了。所以,在事务提交之前,其他事务不能更新表的其他行。为什么“WITH(ROWLOCK)”不生效?

我正在使用以下带有行锁的查询:

DELETE FROM DefDatabaseSession  WITH (ROWLOCK) WHERE ProcessName='test';

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

[SQLServer JDBC Driver][SQLServer]Lock request time out period exceeded.; nested exception is java.sql.SQLException: [newscale][SQLServer JDBC Driver][SQLServer]Lock request time out period exceeded.: com.newscale.bfw.udkernel.kernel.UdKernelException: udconfig.defdbsession.delete; uncategorized SQLException for SQL [DELETE FROM DefDatabaseSession WHERE ProcessName = ?]; SQL state [HY000]; error code [1222]; [newscale][SQLServer JDBC Driver][SQLServer]Lock request time out period exceeded.; nested exception is java.sql.SQLException: [newscale][SQLServer JDBC Driver][SQLServer]Lock request time out period exceeded.

最佳答案

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

有关详细讨论,您可以访问此链接: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

关于sql-server - 为什么在更新语句中使用 "with (rowlock)"时整个表被锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18042739/

相关文章:

c# - DbSet 查找总是返回 null

sql - MSSQL - 选择表中最新出现的几行

sql - SQL 查询中的条件Where 子句

sql - 使用此查询实现分页(跳过/获取)功能

database - 使用 ElasticSearch 作为事实来源

mysql - 我在下表之间建立了多对多关系,我做得对吗?其次我想要对他们进行联接查询

database - 发送数据库文档 ID(安全)

sql - 如何对结果和当前值进行对角减法

sql - 根据条件将新列插入表中

sql - 使用格式文件在 SQL 中批量插入 csv 以删除双引号