0%

数据库(四)锁理论

事务并发带来的问题

  • 丢失修改(lost update)事务 1 与事务 2 从数据库中读入同一数据并修改,事务 2 的提交结果破坏了事务 1 提交的结果, 导致事务 1 的修改被丢失。(W-W)
  • 读 “脏” 数据(dirty read)事务 1 修改某一数据,并将其写回磁盘,事务 2 读取同一数据后,事务 1 由于某种原因被撤消,这时事务 1 已修改过的数据恢复原值,事务 2 读到的数据就与数据库中的数据不一致,是不正确的数据,又称为 “脏” 数据。(W-R)
  • 不可重复读(non-repeatable read)事务 1 读取数据后,事务 2 执行更新操作,使事务 1 无法再现前一次读取结果。(R-W)

并发不一致性的解决办法(封锁协议)

  • 一级封锁协议

    事务 T 在修改数据 W 之前必须先对其加 X 锁,直到事务结束才释放(读不加锁)

    一级封锁协议可防止 丢失修改

  • 二级封锁协议

    一级封锁协议基础上,事务 T 在读取数据 R 之前必须先对其加 S 锁,读完后即可释放 S 锁

    **二级封锁协议可以防止 丢失修改 和 读 “脏” 数据 **

  • 三级封锁协议

    一级封锁协议基础上,事务 T 在读取数据 R 之前必须先对其加 S 锁,直到事务结束才释放

    三级封锁协议可防止 丢失修改、读脏数据和不可重复读

并行事务正确性的唯一准则(可串行化调度)

可串行性的定义

几个事务的并行执行是正确的,当且仅当其结果与按某一次序串行地执行它们时的结果相同。 这种并行调度策略称为可串行化(Serializable) 的调度

可串行性是并行事务正确性的唯一准则

什么是冲突操作

冲突操作是指读写操作写写操作

什么是冲突可串行化调度

一个调度 Sc 在保证冲突操作的次序不变地情况下,通过交换两个事务不冲突操作的次序得到另一 个调度 Sc’ , 如果 Sc’是串行的,则称调度 Sc 为冲突可串行化的调度

一个调度是冲突可串行化的,则一定是可串行化的调度。 (充分条件)

可串行化的方法(两段锁协议)

两段锁协议的内容

  • 在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁
  • 在释放一个封锁之后,事务不再获得任何其他封锁

所有遵守两段锁协议的事务,其并行执行的结果一定是正确的

事务遵守两段锁协议是可串行化调度的充分条件,而不是必要条件。可串行化的调度中,不一定所有事务都必须符合两段锁协议。

两段锁协议并不要求事务必须一次将所有要使用的数据全部加锁,因此遵守两段锁协议的事务可能发生死锁