并发操作带来的问题:丢失修改、不可重复读、读‘脏’数据(后两种也被称为幻影现象)
并发控制的方法:封锁、时间戳、乐观控制法和多版本并发控制等
1.封锁
封锁类型:排他锁和共享锁
一级封锁协议:事务T在修改数据R之前必须对其加X锁,直到事务T结束以后才释放。解决了:丢失修改
二级封锁协议:在一级封锁协议的基础上,增加读数据之前必须加S锁,读完即可释放。解决了:丢失修改和读'脏'数据
三级封锁协议:在一级封锁协议的基础上,增加读数据之前必须加S锁,事务结束后才可以释放。解决了:全部问题
2.活锁和死锁
避免活锁:先来先服务
预防死锁:一次封锁法、顺序封锁法
诊断死锁和接触死锁:可以通过超时法或者事务等待图法诊断死锁,当发现死锁以后,选择一个处理死锁代价最小的事务将其撤销,释放此事务持有的锁,使其他事务得以继续运行下去。
3.并发调度的可串行性
可串行化调度:多个事务并发执行是正确的的,当且仅当与某一次序串行地执行这些事务时的结果相同。
可串行性是并发事务正确调度的准则。
***判断一个调度是否是冲突可串行化的?
答:冲突操作:不同事务对一个数据的读写、写写操作。各种互换位置,变成“事务1->事务2->事务3”这种形式的话,就证明这个调度是冲突可串行化的。并且冲突可串行化一定是可串行化的调度(充分条件)。
4.两段锁协议~针对每一个事务
概念:在对任何数据读、写操作之前,必须申请并获取该数据的锁;在释放一个封锁之后,事务不再申请和获得任何其他封锁。
【拓】遵循两段锁协议,一定是可串行化的;可串行化的,不一定遵循两端锁协议;遵循两段锁协议的可能会出现死锁现象。
5.封锁的粒度