数据库的并发控制

119 阅读3分钟
  • 「这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战
  • dd:本篇文章内容包含了事务的并发、封锁及封锁协议、活锁与死锁生成与解决。

一、事务并发

  • 事务是并发控制的基本单位,而只有数据库系统正确地对并发操作进行调度,才能保证事务的 隔离性一致性 。 1、丢失修改 (lost update)
  • 事务 T1、T2 读入同一数据并修改,但其中的事务 T1 提交的数据修改了另一个事务 T2 提交的数据,从而导致数据丢失。 2、不可重复读 (non-repeatable read)
  • 事务 T1 读取数据后,另一事务 T2 执行时不可以再次读取事务 T1 读取的数据。 3、读脏数据 (dirty read)
  • 事务 T1 修改了一个数据并将其写回磁盘,另一事务 T2 读取该数据后,事务 T1 进行了撤销操作,而事务 T2 读取到的数据是修改后的值,此时事务 T2 的数据与数据库中的数据不一致。

2022-01-30 144550.jpg

  • 并发控制的主要技术有 封锁 (locking)、时间戳 (timestamp)、乐观锁 (optimistic scheduler)、多版本并发控制 (MVCC)。

二、封锁

  • 封锁是实现并发控制的重要手段,是在对数据对象操作之前,向系统发出加锁的请求,只有在释放它的锁后,此对象才能被操作。基本的两种锁如下: 1、排他锁 (exclusive locks)
  • 又称 写锁,简称 X 锁。事务 T 对数据对象加 X 锁后,只允许事务 T 读取和修改数据,其他事务也不能对该数据对象加任何锁,直至锁被释放。 2、共享锁 (share locks)
  • 又称 读锁,简称 S 锁。事务 T 对数据对象加 S 锁后,事务 T 只允许读取而不能修改数据,此时其他事务对此只能加 S 锁,直至锁被释放。

三、封锁协议

  • 对于何时申请 X 锁或 S 锁、持锁时间、何时释放等规则,称为 封锁协议 (locking protocol)。 1、一级封锁协议
  • 指事务 T 在修改数据 R 之前必须先加 X 锁,直至事务结束才释放,包括 COMMIT、ROLLBACK 。 2、二级封锁协议
  • 在一级封锁协议的基础上增加事务 T 在读取数据 R 之前必须对其加上 S 锁,读完后即可释放 S 锁。 3、三级封锁协议
  • 在一级封锁协议的基础上增加事务 T 在读取数据 R 之前必须对其加 S 锁,直至事务结束才释放。

20220130-174717.jpg

四、死锁 & 活锁

1、活锁

  • 如事务 T1 封锁了数据 R,事务 T2 又请求封锁 R,于是 T2 处于等待状态,往后亦是如此。而 T2 可能永远等待,此时就是活锁情形。
  • 可以通过采用 先来先服务 的策略来避免活锁。 2、死锁
  • 如事务 T1 锁住了 R1,事务 T2 锁住了 R2,然后他们又互相请求对方锁住的数据,但同时又等待对方释放各自锁住数据的锁,从而形成了死锁。 >死锁预防< ----------------------------------------------------------------------------
  1. 一次封锁法
  • 每个事务必须一次将所有要使用的数据全部加锁,否则不能继续执行。虽可以有效预防,但降低了并发度。
  1. 顺序封锁法
  • 预先将数据对象规定了一个封锁顺序,所有事务都按此顺序进行封锁。也可有效预防死锁,但这样维护困难,维护成本高。 >死锁诊断与解除< -----------------------------------------------------------------------
  1. 超时法
  • 事务等待的时间超过了规定的限制,即认为发生了死锁。
  1. 等待图法
  • 并发控制系统生成事务等待图 (有向图),并进行检测。