当前位置: 代码迷 >> Sql Server >> SQLSERVER多字段的非聚集更新时加锁有关问题
  详细解决方案

SQLSERVER多字段的非聚集更新时加锁有关问题

热度:16   发布时间:2016-04-24 09:07:00.0
SQLSERVER多字段的非聚集更新时加锁问题
求SQLSERVER高手解答:
SQLServer在对于一个多字段非聚集索引更新的时候会怎么加锁?
      对索引值UPDATE的时候会对单个索引值加锁还是整个索引加锁?
       更新完成后会不会立马对索引进行排序,排序时会不会对影响的索引值加锁?
------解决思路----------------------
1. 更新时还有多种情况,是否有条件,更新的列是否在索引中,是否有聚集索引。如果条件符合聚集索引,则使用聚集索引查找符合条件的更新列,按顺序一直查找子叶数据,一个个建键锁,再更新聚集索引。。如果条件符合非聚集索引,则先按非聚集索引查找,更新列如果不在聚集索引中,则使用键查找,并键这些对象加键锁,最后更新聚集索引。

2. 没有对索引加锁的说法,索引不是锁粒度。使用到索引的,叫做键key,加的是键锁。更新一行中的值如果索引能找到,就加键锁,一次性更新超过5000行或者更多,锁就会升级表锁。锁升级过程会可能产生意向锁、页锁等。如果使用分区,可以设置表选项让锁不升级为表锁,而可以升级”分区锁“——即锁住分区的索引树。

3. 更新索引看首个键列是怎么排序的,即所以是按什么顺序排序的。更新索引列时也会重新排序键列。更新时(排序)已经锁住相应的键列,是有影响。

------解决思路----------------------
锁是按记录来的。
更改时用记录的RID加了一个锁,非聚集索引的节点上有RID,等于这个索引节点也加了锁。
更新索引字段如果改变了和前后记录的大小关系,会马上进行排序。排序和记录锁没关系。不明白你所谓的“影响”指什么?
  相关解决方案