• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

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

sql-server 来源:vani 3次浏览

我使用WITH(ROWLOCK)更新表的一行,但通过执行“sp_lock”我可以看到整个表是锁定。因此,在事务提交之前,其他事务不能更新表的其他行。为什么“WITH(ROWLOCK)”不起作用?为什么在更新语句中使用“with(rowlock)”的同时整个表被锁定

我使用下面的查询与ROWLOCK:

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

在同一时间从任何其他交易运行在同一表格差分行的相同删除操作我得到异常

[ SQLServer JDBC驱动程序] [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驱动程序] [SQLServer]超出锁定请求超时时间。嵌套异常是java.sql.SQLException:[newscale] [SQLServer JDBC驱动程序] [SQLServer]超出锁定请求超时期限。

===========解决方案如下:

这里的原因是优化器忽略你的行锁提示[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


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)