• SQLServer锁的基础问题探究


    SqlServer需要在执行操作前对目标资源获取所有权,那么久发生锁定,是一个逻辑概念。为了保证事务的ACID特性设计的一种机制。

    在多用户并发操作数据时,为了出现不一致的数据,锁定是必须的机制。使用锁可保证数据一致性,但这也致使你在编码、设计时要把锁定考虑进去。如果锁的数量太多,持续时间过长,对并发和系统性能都没有好处。

    在SQL Server支持的隔离级别中,级别越高,严格性也就越高,这就增加了阻塞甚至死锁的机会。

    锁资源:行、页、或者表(如果有分区、可能还有分区锁)

    锁模式:共享锁、排他锁、更新锁、意向锁、

    锁的所有权:锁的范围。绝大部分锁的范围是事务范围的

    锁定的元数据:使用sys.dm_tran_locks这个DMV解锁。

    SQLServer可以在用户数据的行(RID/KEY锁)、页(PAGE锁)或者表(OBJECT锁)级别上锁定资源。SQLServer会尽可能申请行级锁、以便获取最高的并发度。

    SQL Server锁住一个索引上的行时,在sys.dm_tran_locks中会显示Key;如果是锁住了堆表上的数据行,则会显示RID,如果堆上有非聚集索引,实际上是锁住了整个索引行,而不仅仅是索引键。当会话运行在SERIALIZABLE隔离级别下,还可能会锁住索引行的一个范围

    根据不同的隔离级别,可以支持两种Key锁,如果事务的隔离级别为READ COMMITTED/REPEATABLE READ,会锁住查询需要的索引行,如果数据表上有聚集索引,实际的数据行在叶子节点中,显示KEY锁,如果表为堆表,SQL Serer会把锁加到非聚集索引中,也叫KEY锁,或者加在堆的数据行上,叫RID锁

    隔离级别为SERIALIZABLE,为了避免幻读,SQL Server 会锁住一个范围,如果所查询的是范围值,那么需要锁住足够的部分,确保另外一个事务不会在这个事务扫描的过程中插入值,这种说在DMV中显示key-range锁。

    幻读:如果事务A中有两个相同的查询,而且带有了限定词(如WHERE条件)在第一次查询之后,会锁住查询所需的数据范围,而事务B这时插入了一行满足WHERE条件的数据,在第一次查询中没有这条数据,没有锁住,插入是成功的,当事务A进行第二次查询时,就会出现这条新数据,于是就出现了幻读。

  • 相关阅读:
    AutoCompleteTextView控件的使用
    menu菜单
    fragment之间的通信
    fragment的生命周期
    用模型取代字典的好处
    使用fragment兼容低版本的写法
    模拟微信主界面
    动态替换fragment
    fragment入门
    Spring MVC学习总结(1)——Spring MVC单元测试
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/10011497.html
Copyright © 2020-2023  润新知