03数据库系统
08-数据库并发控制
2021-08-01 301 1
简介 文章介绍了在没有锁的情况下,数据库并发时带来的问题。三个级别的封锁协议,2PL等。
事物的特性
原子、一致、隔离、持久 ACID
并发控制存在的问题
丢失更新、读“脏”数据、不可重复读
并发操作的概念:
在多用户系统中, 许多用户可能同时对同一数据进行操作
可能导致的问题:
丢失更新:
两个事务T1和T2读入同一数据,并修改, T2提交的结果破坏了T1提交的结果, 导致T1的修改丢失
读“脏”数据(只读一次就读到了脏数据)
事务T1修改某一数据并写磁盘, 事务T2读取同一数据后, T1由于某种原因被撤销, 这时,T1修改的数据被恢复到原值, 之前T2读取的数据就跟数据库中的数据不一致, 即T2读取了“脏”数据
不可重复读(两次或以上读取,读取结果不一致、少读、多读)
事务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锁。
锁的粒度:封锁的对象大小称为封锁的粒度
锁的对象可以是逻辑单元: 如属性、元组、关系、索引项、整个索引、甚至整个数据库等; 也可以是物理单元: 如数据页、索引页等
三个级别的封锁协议
一级封锁协议:
解决丢失更新问题, 事务T在对A修改(更新)前,必须加X锁。如果是只读, 不需要加X锁,不能避免“不可重复读”, 读“脏”数据的问题。如上图的丢失更新, 在Read(A)之前就加X锁。
二级封锁协议
在一级封锁协议的基础上,在读A时候加S锁,读完就释放S锁, 解决了读“脏”数据的问题,不能保证可重复读
三级封锁协议:
在一级封锁协议的基础上,在事务T读取A之前就加S锁, 直到事务T结束才释放S锁。解决了丢失更新、 读“脏”数据, 不可重复读问题。
两段封锁协议(2PL)
加锁和释放所的顺序定义的。保证了可串行化,把事务分为加锁和释放锁两个阶段, 严格两阶段封锁协议, 事务执行时申请排它锁, 事务执行完后才释放排它锁。 强两阶段封锁协议, 事务持有的全部锁,必须在事务执行完后才释放锁。 保证事务可串行化,但不能保证不发生死锁,也就是可能会出现死锁。
第一阶段: 获得锁, 第一阶段只能获取锁
第二阶段: 释放所, 第二阶段释放锁
2pl 就是一个事务内,最后一个加锁前 不能出现解锁,,第一个解锁后不能出现加锁
可串行化
多个事务的并发执行是正确的, 当且仅当其结果与某一次序串行地执行他们时的结果相同