• 数据库事务的学习02


    1、排他锁、共享锁
    排他锁:
    若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加上任何其他类型的锁,直到T释放A上的锁为止。

    共享锁:
    若事务T对数据对象A加上了S锁,则事务T可以读A但不能修改A,其他事务只能对A加上S锁,而不能加入X锁。
    2、封锁类型的相容矩阵
    T1 \\\ T2 X S -
    X N N Y
    S N Y Y
    - Y Y Y
    Y=YES 相容的请求
    N=NO 不相容的请求

    X:排他锁
    S:共享所
    -:表示不加锁

    例子:
    T1对对象A加了X锁,那么T2对对象A的加X,S锁的请求被拒绝,不加锁的请求被允许
    注意:如果请求是 修改/读取对象A但是不对其加锁的请求,是被允许的,这样锁就没有意义了,所以要搭配封锁协议来使用
    如下面的书页P311中的例子c:
    事务T1在修改数据C,第二个时间点T2事务去查询数据C,书上说如果读的时候不加S锁会产生脏读。
    说明不加锁可以读到数据而不用等待。
    同理:不加锁的去请求修改也可以的。
    3、封锁协议
    一、一级封锁协议
    一级封锁协议是:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。
    一级封锁协议可以防止丢失修改,并保证事务T是可恢复的。使用一级封锁协议可以解决丢失修改问题。
    在一级封锁协议中,如果仅仅是读数据不对其进行修改,是不需要加锁的,它不能保证可重复读和不读“脏”数据。
    二、二级封锁协议
    二级封锁协议是:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后方可释放S锁。
    二级封锁协议除防止了丢失修改,还可以进一步防止读“脏”数据。但在二级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读。
    三、三级封锁协议
    三级封锁协议是:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。
    三级封锁协议除防止了丢失修改和不读“脏”数据外,还进一步防止了不可重复读
    上述三级协议的主要区别在于什么操作需要申请封锁,以及何时释放。

  • 相关阅读:
    第2章 NIO入门
    Docker Compose命令详解
    网络层相关术语解释
    linux查看并发连接数
    带宽计算方法
    ELK日志分析平台搭建
    mysql查找json格式列的指定字段值
    Oracle性能优化
    修改hosts文件不需要重启的方法
    freeswitch的internal的profile无法启动
  • 原文地址:https://www.cnblogs.com/dxwen/p/11197340.html
Copyright © 2020-2023  润新知