03数据库系统

08-数据库并发控制

2021-08-01 224 1

简介 文章介绍了在没有锁的情况下,数据库并发时带来的问题。三个级别的封锁协议,2PL等。

事物的特性

    原子、一致、隔离、持久  ACID

并发控制存在的问题

    丢失更新、读“脏”数据、不可重复读

    并发操作的概念:

        在多用户系统中, 许多用户可能同时对同一数据进行操作

    可能导致的问题:

        丢失更新:

upfile

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

        读“脏”数据(只读一次就读到了脏数据)

upfile


            事务T1修改某一数据并写磁盘, 事务T2读取同一数据后, T1由于某种原因被撤销, 这时,T1修改的数据被恢复到原值, 之前T2读取的数据就跟数据库中的数据不一致, 即T2读取了“脏”数据

        不可重复读(两次或以上读取,读取结果不一致、少读、多读)

upfile

            事务T1读取数据后, 事务T2执行其他操作, 使得T1无法再次重现前一次读取的结果

            1. 事务T1读记录,事务T2对其做了修改, 事务T1再次读

            2. 事务T1按一定条件读, T2删除了其中的部分记录, T1再次按相同条件读取时,无法再现之前的结果

            3. 事务T1按一定条件读, T2插入了一些记录, 当T1再次读时, 无法重现之前的结果。


封锁

    排他锁:

        又称为写锁,X锁, 事务T在A上加了X锁, 只允许事务T读取和修改A, 而不允许其他任何事务读取和修改A,也不允许其他事务对A加任何类型的锁, 直到T释放A上的X锁。

    共享锁:

        又称读锁,S锁, 事务T在A上加了S锁后, 事务T只能读A但不能修改A, 其他任何事务只能读A,不能修改A, 其他事务只能对A加S锁,而不能加X锁。

    锁的粒度:封锁的对象大小称为封锁的粒度

        锁的对象可以是逻辑单元: 如属性、元组、关系、索引项、整个索引、甚至整个数据库等;  也可以是物理单元: 如数据页、索引页等


三个级别的封锁协议

    一级封锁协议:

upfile

        解决丢失更新问题, 事务T在对A修改(更新)前,必须加X锁。如果是只读, 不需要加X锁,不能避免“不可重复读”, 读“脏”数据的问题。如上图的丢失更新, 在Read(A)之前就加X锁。

    二级封锁协议

upfile


        在一级封锁协议的基础上,在读A时候加S锁,读完就释放S锁, 解决了读“脏”数据的问题,不能保证可重复读

    三级封锁协议:

upfile


        在一级封锁协议的基础上,在事务T读取A之前就加S锁, 直到事务T结束才释放S锁。解决了丢失更新、 读“脏”数据, 不可重复读问题。


两段封锁协议(2PL)  

    加锁和释放所的顺序定义的。保证了可串行化,把事务分为加锁和释放锁两个阶段, 严格两阶段封锁协议, 事务执行时申请排它锁, 事务执行完后才释放排它锁。 强两阶段封锁协议, 事务持有的全部锁,必须在事务执行完后才释放锁。 保证事务可串行化,但不能保证不发生死锁,也就是可能会出现死锁。

    第一阶段: 获得锁, 第一阶段只能获取锁

    第二阶段: 释放所, 第二阶段释放锁

    

    2pl 就是一个事务内,最后一个加锁前 不能出现解锁,,第一个解锁后不能出现加锁



可串行化

    多个事务的并发执行是正确的, 当且仅当其结果与某一次序串行地执行他们时的结果相同


点赞 1

文章评论

欢迎您:

纸上得来终觉浅,绝知此事要躬行!

112 文章 59446 浏览 3 评论

联系我

  •   QQ:    361352119
  •  Email:  lisimmy@sina.com
  • 微信: