• 数据库事务和锁


    事务

    (锁+回滚)作为工作单元执行的一系列操作。

    显式事务和隐式事务

    锁模式

    排它锁exclusive lock

    共享锁shared lock

    更新锁 

    兼容共享锁,不兼容更新锁、排它锁

    意向锁

    目的:在较高粒度级别有效监测不兼容的锁定请求,防止授予不兼容的锁。

    架构锁

    其他更高级锁

    锁的兼容性

    事务之间相互制约的关系就是锁的兼容性。

     可锁定资源类型

    可锁定资源类型或粒度资源,包括RID 或者KEY(行) 、PAGE(页) 、 对象(如:表) 、数据库等。

    其他更高级的可锁定类型:EXTENT(区,表在物理上可以分为多个更小单元,即分区)、分配单元(ALLOCATION_UNIT) 、堆(HEAP) 、B-tree

    行位于页中,页是包含表或者索引数据的物理数据块

    为了获得特定资源类型上的锁,事务必须在更高的粒度级别上获得相同模式的意向锁

    锁升级

    SQL Server可以先获得细粒度的锁(如行、页锁),在某些情况下尝试升级为更粗粒度的锁(如表锁)。例如:单个语句获得至少5000个锁时,就触发锁升级。(?)

    锁隔离级别

    决定如何控制并发用户读写数据的操作。读操作默认使用共享锁,写操作需要使用排它锁。对于操作获得的锁,以及锁的持续时间来说,虽然不能控制写的操作方式,但可以控制读操作的行为方式,隐含得影响写操作的行为。

    设置方式:1.会话选项设置隔离级别 SET  TRANSACTION   ISOLATION   LEVEL   <isolation name>       2.查询级别上使用表提示设置隔离级别  SELECT  。。。 FROM <Table> WITH (<isolation name>)

    6个隔离级别

    READ UNCOMMITTED 未提交读  (NOLOCK) 读操作不请求共享锁,允许脏读

    READ COMMITTED 已提交读 (default) 防止脏读的最低隔离级别,读操作必须获取共享锁才能操作。此隔离级别中,读操作已完成就立即释放资源上的共享锁。读操作不会在事务持续期间内保留共享锁。甚至,在语句结束前也不能保留共享锁。这意味着一个事务内对相同数据资源的读操作之间,没有共享锁会锁定该资源。其他事务可以在两个读操作之间修改该资源,导致两次取到不同的值。这种现象称为:不可重复读

    REAPEATABLE READ 可重复读  事务中的读操作需要获取共享锁才能读取数据,而且共享锁将一直保持到事务完成为止。

    SERIALIZABLE可序列化  (HODELOCK) 上一个隔离级别(REPEATABLE READ)中事务在第一次读取某些行后,可以重复读取这些行。但是事务只是锁定第一次查询找到的那些资源(如:行),如果其他事务插入新行,而且新行满足读操作的查询条件,那么第二次读取的结果会包含新行。这种新行为成为幻读。

    SNAPSHOT 快照

    READ COMMITTED SNAPSHOT 已经提交读隔离

    隔离级别总结

    获取隔离级别 :DBCC USEROPTIONS 

    设置隔离级别:SET TRAN ISOLATION LEVEL [READ UNCOMMITTED]

     等待 waitfor delay '00:00:15'

    事务隔离级别

  • 相关阅读:
    1 Groovy
    HDU
    伸展树整理
    HYSBZ
    markdown语法整理
    HDU
    【JZOJ3085】图的计数【数论】
    【JZOJ3085】图的计数【数论】
    【JZOJ3084】超级变变变【模拟】【规律】
    【JZOJ3084】超级变变变【模拟】【规律】
  • 原文地址:https://www.cnblogs.com/fmys/p/9208788.html
Copyright © 2020-2023  润新知