数据库理论(七)——并发控制

并发控制的任务

1. 对并发操作进行正确调度
2. 保证事物的隔离性
3. 保证数据库的一致性

并发操作可能带来的数据不一致性

  1. 丢失修改
  2. 不可重复读
  3. 读“脏”数据

辅助符号

  1. R(X):读数据x
  2. W(X):写数据x

并发控制的基本理念

  1. 封锁(Locking)
  2. 时间戳(Timestamp)
  3. 乐观控制法

商用的DBMS通常采用封锁发方法

封锁

封锁指事物T在对某个数据对象(表,记录)操作之前,先向系统发出请求,对其加锁;

加锁后,事物T就对该数据对象有了一定的控制,在事物T1释放它的锁之前,其他事物不能更新此数据对象。

事物对数据对象加锁的类型决定了事物对数据对象的控制

  1. 排他锁(Exclusive Locks,简记为X锁,写锁)
    1. 事物T在更新数据对象之前,必须先获得数据对象的排他锁
    2. 若事物T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事物都不能在对A加任何类型的锁
  2. 共享锁(Share Locks,简记为S锁,读锁)
    1. 事物T在读取数据对象之前,必须先获得数据对象的共享锁
    2. 若事物T对数据对象A加上S锁,则其他事物只能再对A加上S锁,而不能加上X锁,直到T释放A上的S锁

封锁的积极面

​ 让访问同一数据对象的事物保持隔离性(互斥访问),保证了数据的一致性

封锁的副作用

1.  加锁和解锁的开销会降低数据的操作性能
2.  会出现一些特殊的加锁情况
   	1.  死锁:两个及以上的事物在相互等待,使得CPU的使用率为0
   	2.  活锁:某个事物一直处于等待状态而无法被执行

如何判断两个事物能否并发进行

读写和写写的事物不能并发进行,读读的事物能并发进行

怎么理解这句话呢,

可以举个例子

事物T1要执行W(x),R(y)

事物T2要执行R(x)

从上面的两个事物中都对x进行了操作,T1要写x,T2要读x,这与上面加粗的读写情况相同,因此不能并发进行

再举个例子

事物T1要执行W(x),R(y)

事物T2要执行W(x)

从上面的两个事物中都对x进行了操作,T1要写x,T2要写x,这与上面加粗的写写情况相同,因此不能并发进行

最后举个例子

事物T1要执行R(x),W(y)

事物T2要执行R(x)

从上面的两个事物中都对x进行了操作,T1要写x,T2要写x,这与上面加粗的读读情况相同,因此可以并发进行

可串行调度

多个事物的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事物时的结果相同。

如何判断一个调度是可串行化的调度呢?

并发结果与任意一种串行运行结果相同即为可串行化的调度

为冲突可串行化调度一定为可串行化调度,反之不然。

冲突可串行化调度是指当前的并行事物读写操作,能够经过某种合理交换操作,实现任意一种串行的结果即为冲突可串行化调度。

两段锁协议

事物分两个阶段对数据项加锁和解锁

第一阶段:拓展阶段(申请并获得封锁)

1. 事物可以申请获得任何数据项上的任何类型的锁,但是不能释放任何锁

第二阶段:收缩阶段(释放封锁)

  1. 事物可以释放任何数据项上的任何类型的锁,但是在释放一个封锁之后,事物不能再申请和获得任何其他封锁