我使用 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) 向优化器提供查询提示]。这将在您遇到大量行的情况下发生,在这种情况下,优化器发现在您的表上进行堆扫描并因此获得表锁更可行。
关于sql-server - 为什么在更新语句中使用 "with (rowlock)"时整个表被锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18042739/