增删改查操作下锁的相关情况_增删改时的锁分析

摘要:上一篇分析了查询时的锁情况,本篇将对剩下的增删改情况进行分析

注:该篇中关于锁的申请说明并不是锁的申请顺序,而是锁的大概层次申请

新增时的锁的情况

无索引情况:

锁情况如图:

锁申请说明:

(1).在数据库上申请共享锁,防止数据库结构变更

(2).对应的表上申请意向排它锁

(3).在对应的数据页上申请意向排它锁

(4).在数据所在行上申请排它锁

只有非聚集索引

锁情况:

锁申请说明:

非聚集的情况跟无索引的差不多,只不过增加了索引所在页面的意向排它锁以及索引键值上的排它锁

只有聚集索引

锁情况:

 锁申请说明:

(1).在数据库上申请共享锁,防止数据库结构变更

(2).对应的表上申请意向排它锁

(3).在对应的数据页上申请意向排它锁

(4).在数据所在键值上申请排它锁

聚集、非聚集索引共存情况

锁申请说明:

(1).在数据库上申请共享锁,防止数据库结构变更

(2).对应的表上申请意向排它锁

(3).在聚集、非聚集索引所对应的数据页上申请意向排它锁

(4).在聚集、非聚集所因对应的键值上申请排它锁

 新增数据的影响总结

从以上的数据来看,添加数据是很少会造成堵塞、死锁的,只是影响自身相关的索引、页面之类的,会产生争抢资源的情况有:

1.数据库要改变结构(基本不可能)

2.表结构变更(极少)

3.数据页发生拆分 (少,需要并发且同时处理同一页面且导致页面拆分,而这种情况我还不确定会不会),这种的话建议表上字段尽量不要过大(例如:varchar(2000)),这样发生的可能就非常少

注:为了准确分析出实际情况,删除、更新操作要对多条数据进行处理,同时为了更好的进行测试,表中数据增加至1千个

 删除数据时锁的情况

 无索引情况:

锁情况如图:

锁的申请情况:

(1).在数据库上申请共享锁,防止数据库结构变更

(2).对应的表上申请意向排它锁

(3).在相关搜索过的页面上申请意向更新锁,在数据所在页面上申请意向排它锁

(4).在数据所在行上申请排它锁

只有非聚集索引

锁情况如图:

锁的申请情况:

(1).在数据库上申请共享锁,防止数据库结构变更

(2).对应的表上申请意向排它锁

(3).在索引以及数据所在页面上申请意向排它锁

(4).在索引所在键值上申请排它锁,在数据所在行上申请排它锁

只有聚集索引

 锁情况如图:

锁申请说明:

(1).在数据库上申请共享锁,防止数据库结构变更

(2).对应的表上申请意向排它锁

(3).在对应的数据页上申请意向排它锁

(4).在数据所在键值上申请排它锁

聚集、非聚集索引共存情况

执行计划:

锁情况如图:

 

锁申请说明:

(1).在数据库上申请共享锁,防止数据库结构变更

(2).对应的表上申请意向排它锁

(3).在对应的聚集索引页、非聚集索引页上申请意向排它锁

(4).在数据所在聚集索引、聚集索引键值上申请排它锁

删除数据的影响总结

从它的锁申请情况来看,删除操作是先执行查询,然后再对相应的数据进行删除,其影响的话主要有以下几点:

1.无索引情况下,所有被查询到的数据页上都会申请意向更新锁(如果遍历所有数据的话,则所有数据页都申请),表越大的话,申请的锁就越多

2.删除操作不仅是把数据行本身进行删除,而且还会删除所有相关的索引键,所以在搜索数据时,还会锁上所有相关的锁。所以一个表上索引数目越多,操作的锁的数目就越多,就越容易产生堵塞

所以在一个大表上,既不能没有索引,也不能建立过多的索引,而是适当的在有需要的字段上建立合适的索引

更新时的锁的情况

 无索引情况:

锁情况如图:

锁的申请情况:

(1).在数据库上申请共享锁,防止数据库结构变更

(2).对应的表上申请意向排它锁

(3).在相关搜索过的页面上申请意向更新锁,在数据所在页面上申请意向排它锁

(4).在数据所在行上申请排它锁

只有非聚集索引

执行计划:

锁情况如图:

锁的申请情况:

(1).在数据库上申请共享锁,防止数据库结构变更

(2).对应的表上申请意向排它锁

(3).因为没有走索引,而是进行表扫描,所有被扫描的页面申请了意向更新锁,在索引以及数据所在页面上申请意向排它锁

(4).在索引所在键值上申请排它锁,在数据所在行上申请排它锁

只有聚集索引

执行计划:

 锁情况如图:

锁申请说明:

(1).在数据库上申请共享锁,防止数据库结构变更

(2).对应的表上申请意向排它锁

(3).由于发生索引扫描,在被扫描的数据页上申请意向更新锁,在对应的数据页上申请意向排它锁

(4).在数据所在键值上申请排它锁

聚集、非聚集索引共存情况

执行计划:

锁情况如图:

 

锁申请说明:

(1).在数据库上申请共享锁,防止数据库结构变更

(2).对应的表上申请意向排它锁

(3).在对应的聚集索引页、非聚集索引页上申请意向排它锁

(4).在数据所在聚集索引、聚集索引键值上申请排它锁

更新数据的影响总结

 更新操作跟删除操作一样,都是先搜索相应的数据,再进行更新,对搜索过的页面申请意向更新锁,其影响主要有以下几个方面:

1.无索引情况下,由于表扫描,会对所有扫描过的页面申请锁,表越大,锁越多

2.索引越多的表,申请的锁越多,不合适的索引(如非聚集索引情况)还会导致表扫描,不但会导致被扫描的数据页加锁,还会让所有被扫描索引页加锁,比没索引的还慢

所以在大表上,如果有索引的话,更新、删除操作要尽量走索引,避免耗费大量性能

下一篇将进行对混合情况进行分析,之后再作优化之类的总结

猜你喜欢

转载自www.cnblogs.com/9284chc0r0ij/p/11365480.html