Sql 选择启用RCSI的数据库中的阻塞更新

Sql 选择启用RCSI的数据库中的阻塞更新,sql,sql-server-2008,locking,Sql,Sql Server 2008,Locking,我们有一个数据库,tstERP。tstERP已启用RCSI,并通过以下方式进行验证: 选择“正在读取已提交的快照”,名称来自sys.databases,其中名称='TEST' 有两个连接。SPID 87和243。87是243。详情如下。总之,SPID87“在tbl1上选择”在索引键上具有独占锁。243,一个更新,正在等待同一个密钥上的独占锁 我被告知这里没有任何类型的提示,但我自己并没有看到所有的代码 首先,我有两个关于SPID87的问题 在启用RCSI的情况下,为什么select甚至会使用锁

我们有一个数据库,tstERP。tstERP已启用RCSI,并通过以下方式进行验证:

选择“正在读取已提交的快照”,名称来自sys.databases,其中名称='TEST'

有两个连接。SPID 87和243。87是243。详情如下。总之,SPID87“在tbl1上选择”在索引键上具有独占锁。243,一个更新,正在等待同一个密钥上的独占锁

我被告知这里没有任何类型的提示,但我自己并没有看到所有的代码

首先,我有两个关于SPID87的问题

  • 在启用RCSI的情况下,为什么select甚至会使用锁
  • 不管是否使用锁,这是一个非常简单的select语句,返回一行。为什么交易保持开放?有些开发人员非常喜欢设置隐式trans-on,这有时会让他们在打开trans时遇到麻烦。然而,该代码已经远远超出了设计的范围,因此不应该成为问题
  • 感谢所有的洞察力

    谢谢


    SPID 87-阻塞链的头部

    代码: 从tbl1中选择col1、col2、col3、col4、col5,其中col1=@P1和col2=@P2,col3=@P3和col4=@P4

    锁定:

    Object name="tbl1" schema_name="dbo" Locks Lock resource_type="KEY" index_name="ind1" request_mode="X" request_status="GRANT" request_count="1" Lock resource_type="OBJECT" request_mode="IX" request_status="GRANT" request_count="1" Lock resource_type="PAGE" page_type="*" index_name="ind1" request_mode="IX" request_status="GRANT" request_count="1" /Locks /Object Object name="tbl1" schema_name="dbo" Locks Lock resource_type="KEY" index_name="ind1" request_mode="X" request_status="WAIT" request_count="1" Lock resource_type="OBJECT" request_mode="IX" request_status="GRANT" request_count="1" Lock resource_type="PAGE" page_type="*" index_name="ind1" request_mode="IX" request_status="GRANT" request_count="1" /Locks /Object 对象名称=“tbl1”模式\u名称=“dbo” 锁 锁定资源\u type=“KEY”index\u name=“ind1”请求\u mode=“X”请求\u status=“GRANT”请求\u count=“1” 锁定资源\u type=“OBJECT”请求\u mode=“IX”请求\u status=“GRANT”请求\u count=“1” 锁定资源\u type=“PAGE”PAGE\u type=“*”索引\u name=“ind1”请求\u mode=“IX”请求\u status=“GRANT”请求\u count=“1” /锁 /反对 其他信息: 事务\隔离\级别重新提交/事务\隔离\级别


    SPID 243-被阻止

    代码: 更新tbl1集合col5=vol5+1,其中col1=@1和col2=@2,col3=@3和col4=@4

    锁定:

    Object name="tbl1" schema_name="dbo" Locks Lock resource_type="KEY" index_name="ind1" request_mode="X" request_status="GRANT" request_count="1" Lock resource_type="OBJECT" request_mode="IX" request_status="GRANT" request_count="1" Lock resource_type="PAGE" page_type="*" index_name="ind1" request_mode="IX" request_status="GRANT" request_count="1" /Locks /Object Object name="tbl1" schema_name="dbo" Locks Lock resource_type="KEY" index_name="ind1" request_mode="X" request_status="WAIT" request_count="1" Lock resource_type="OBJECT" request_mode="IX" request_status="GRANT" request_count="1" Lock resource_type="PAGE" page_type="*" index_name="ind1" request_mode="IX" request_status="GRANT" request_count="1" /Locks /Object 对象名称=“tbl1”模式\u名称=“dbo” 锁 锁定资源\u type=“KEY”index\u name=“ind1”请求\u mode=“X”请求\u status=“WAIT”请求\u count=“1” 锁定资源\u type=“OBJECT”请求\u mode=“IX”请求\u status=“GRANT”请求\u count=“1” 锁定资源\u type=“PAGE”PAGE\u type=“*”索引\u name=“ind1”请求\u mode=“IX”请求\u status=“GRANT”请求\u count=“1” /锁 /反对 其他信息: 事务\隔离\级别重新提交/事务\隔离\级别



    回顾我的代码,我在SSMS中重新编写代码的唯一方法是在select中包含XLOCK提示。无论如何都不是真正的复制品。感谢你的回应。即使这样,问题还是变成了为什么没有提交trans。@mnDBA-可能是因为代码从未提交它。不知道你怎么期望有人根据给出的信息回答这个问题。