• 数据库 之 并发调度


    并发控制概述

    为保证事务的隔离性和一致性,DBMS需要对并发操作进行正确的调度

    并发操作引起的数据库不一致的现象:

    丢失修改[ww]

    两个事务T1和T2读同一个数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失。如下图:

    不可重复读[rw(r)]

    (1)事务T1读取某一数据后,事务T2对其做了修改,当事务T1再读该数据时,得到与前一次不同的值。如下图:

    (2)事务T1按照一定条件从数据库中读取了某些数据记录后,事务T2删除了其中部分记录,当T1再次按相同条件读取数据时,发现某些记录神秘的消逝了。

    (3)事务T1按照一定条件从数据库中读取了某些数据记录后,事务T2插入了一些记录,当T1再次按相同条件读取数据时,发现多了一些记录。

    后两种不可重复读有时候称为幻影现象

    读脏数据[wr]

    读脏数据是指事务T1修改某一数据,并将其写回磁盘,事务T2读取同一个数据后,T1由于某种原因被撤销(T1回滚),这时T2读到的数据与数据库中的数据不一致,则T2读到了脏数据。

    封锁

    所谓封锁就是事务T再对某个数据对象例如表、记录等操作执行之前,先向系统发出请求,对其加锁,加锁之后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他事务不能更新此数据对象

    排它锁又称写锁。若事务T对数据对象加上X锁,则只允许T读取和修改A,其他任何事务都不能对A加任何数据类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。

    共享锁又称读锁。若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他任何事务只能再对A加S锁,而不能再加X锁,直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

    读锁和写锁的关系(图为封锁类型的相容关系矩阵):

    一级封锁协议

    在事务T在修改数据R之前必须现对其加X锁,直到事务结束才释放该锁。

    一级封锁协议中,如果是读数据,不需要加锁,它不能保证可重复读和不读脏数据。

    二级封锁协议

    一级封锁协议+事务T在读取数据之前必须加S锁,读完后即可释放S锁。(二级封锁协议可防止读脏数据)

    三级封锁协议

    一级封锁协议+事务T在读取数据之前必须加S锁,直到事务结束才释放。

  • 相关阅读:
    mongodb分片
    mongodb读写分离的一些选项的理解
    mongodb管理副本集(持续更新中)
    mongodb配置副本集(多台服务器间的副本集搭建) replica[ˈrɛplɪkə]
    mongodb副本集的基础概念和各种机制
    mongodb的查询
    mongodb文档的CRUD
    SQLServer2008数据库连接error40错误
    Did you forget about DBModel.InitializeModel the model [AAAdm] ?
    ERP中通过EDI导入资料的时候出现【Microsoft Office Excel不能访问文件‘C:WindowsTEMP433....’
  • 原文地址:https://www.cnblogs.com/gxcstyle/p/6870113.html
Copyright © 2020-2023  润新知