课堂知识
并发控制机制
大概可以分为悲观的和乐观的两种
悲观锁:认为数据库的一致性经常会受到破坏,因此在事务访问数据对象前必须采取一定措施进行控制,只有得到访问许可时,才能访问数据对象,如基于封锁的并发控制方法。 ——事前控制 乐观锁:乐观的并发控制方法认为数据库的一致性一般是不会被破坏的,因此事务执行的过程中是可以直接访问数据的。只是在事务结束的时候才验证数据库的一致性是否被破坏,如基于有效性的验证方法。——事后验证
基于封锁方法的基本思想
基本思想:当事务T需要访问数据对象Q的时候,先申请对Q的锁。如果批准获得,那么事务T就继续进行,且此后不允许其他事务修改Q,直到事务T释放对Q的锁为止。
如果申请对Q的锁的时候,Q已被上锁,那么该事务就会阻塞等待。
基本锁类型:
- 共享锁(shared lock, S锁):如果事务T获得了数据对象Q的共享锁,那么事务T可读Q但是不能写Q。
- 排他锁(eXclusive lock, X锁):如果事务T获得了数据对象Q的排他锁,那么事务T既可以读Q也可以写Q
基本锁类型的相容性原则:
- 共享锁和共享锁是相容的。(读操作不会影响事务之间数据的一致性)。
- 排他锁和共享锁、排他锁和排他锁之间是不相容的(写操作可能影响事务之间数据的一致性)。
申请和释放锁:
SL(Q)
——申请数据对象Q上的共享锁XL(Q)
——申请数据对象Q上的排它锁UL(Q)
——释放数据对象Q上的锁
封锁协议
运用X锁和S锁对数据对象加锁的时候,需要约定一些规则:
- 何时申请X锁和S锁
- 持锁时间以及锁在何时释放
常用的封锁协议:三级封锁协议
- 一级封锁协议:
- 事务T在修改数据R之前必须对R加上X锁,直到事务结束才释放,事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)
- 一级封锁协议可以防止丢失修改
- 但是不能防止读脏数据,也不能保证可重复读
会读取到其他事务的中间临时数据
- 二级封锁协议:
- 在一级封锁协议的基础上,在读取数据R之前必须先加上S锁,在读取完后就释放S锁
- 二级封锁协议可以防止丢失修改和读“脏”数据,但不能保证可重复读
- 三级封锁协议:
- 在一级封锁协议的基础上,事务T在读取数据R之前,必须对R加上S锁,并且直到事务结束才释放S锁
- 三级封锁协议,可以防止丢失修改、读脏数据和不可重复读
封锁协议的两阶段
两阶段封锁协议要求每个事务分成两个阶段完成封锁操作:
- 增长阶段:事务可以获得锁,但是不能释放锁
- 缩减阶段:事务可以释放锁,但不能获得新锁
两阶段可能造成的问题: