事务是并发控制的基本单位
1.对并发操作进行正确调度
2.保证事务的隔离性
3.保证数据库的一致性
1.丢失修改(Lost Update):
T1和T2同时读取一个数据,但是T1先提交的或被T2提交的覆盖,导致丢失。
2.不可重复读(Non-repeatable Read):
(1)T1读取数据,T2删除部分记录,T1再读都不全。 (2)T1读取,T2修改数据,T1再读读不全。(3)T1读取,T2插入一条,T1再读就是两条。幻影。
3.读“脏”数据(Dirty Read):
T1修改数据后T2读取,T1修改撤回,T2读的就是数据库中不一致,读了脏数据。
1.封锁(Locking)
2.时间戳(Timestamp)
3.乐观控制法
4.多版本并发控制(MVCC)
在事务开始之前,对数据进行加锁。排他锁X锁(写锁),共享锁S锁(读锁)。排他锁锁定后,别的事务不能再加锁。如果被一个数据被共享锁锁定,那么其他事务也可以添加S锁,但是不能添加X锁。
一级封锁协议
事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。
正常结束(COMMIT),非正常结束(ROLLBACK)
一级封锁协议可防止丢失修改,并保证事务T是可恢复的。
二级封锁协议
一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。
二级封锁协议可以防止丢失修改和读“脏”数据。在二级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读。
三级封锁协议
一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。
三级封锁协议可防止丢失修改、读脏数据和不可重复读。
活锁
就是有一个事务在一直等待数据。后来的都会先于他获取数据资源
避免活锁的方法:先来先服务原则。
死锁
T1和T2相互持有资源,并且又在等待对方资源,所以一直等待,形成死锁。
预防死锁的方法:一次性封锁法(一次性封锁所有需要的资源),顺序封锁法(岁对资源排序,逐个封锁。)。
死锁的诊断:超时法,等待图法(有向图判断是否有环路)。
死锁的解除:处理一个事务,将其所有资源释放。
可串行化(Serializable)调度
多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同
可串行性(Serializability)
是并发事务正确调度的准则
一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度
冲突可串行化
一个调度Sc在保证冲突操作的次序不变的情况下,通过交换两个事务不冲突操作的次序得到另一个调度Sc’,如果Sc’是串行的,称调度Sc是冲突可串行化的调度。
冲突操作:是指不同的事务对同一数据的读写操作和写写操作。
不能交换(Swap)的动作:
同一事务的两个操作
不同事务的冲突操作。
指所有事务必须分两个阶段对数据项加锁和解锁
在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁
在释放一个封锁之后,事务不再申请和获得任何其他封锁
两段锁协议与防止死锁的一次封锁法区别
1.一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行,因此一次封锁法遵守两段锁协议
2.但是两段锁协议并不要求事务必须一次将所有要使用的数据全部加锁,因此遵守两段锁协议的事务可能发生死锁。
封锁对象的大小称为封锁粒度(Granularity)
封锁的对象:逻辑单元,物理单元 。
封锁的粒度越大,数据库所能够封锁的数据单元就越少,并发度就越小,系统开销也越小;
封锁的粒度越小,并发度较高,但系统开销也就越大。
多粒度封锁(Multiple Granularity Locking)
在一个系统中同时支持多种封锁粒度供不同的事务选择。
选择封锁粒度
同时考虑封锁开销和并发度两个因素, 适当选择封锁粒度
需要处理多个关系的大量元组的用户事务:以数据库为封锁单位
需要处理大量元组的用户事务:以关系为封锁单元
只处理少量元组的用户事务:以元组为封锁单位。
显示封锁和隐示封锁
显式封锁: 直接加到数据对象上的封锁
隐式封锁:是该数据对象没有独立加锁,是由于其上级结点加锁而使该数据对象加上了锁。
对数据封锁检查
对某个数据对象加锁,系统要检查
该数据对象
有无显式封锁与之冲突
所有上级结点
检查本事务的显式封锁是否与该数据对象上的隐式封锁冲突:(由上级结点已加的封锁造成的)
所有下级结点
看上面的显式封锁是否与本事务的隐式封锁(将加到下级结点的封锁)冲突
用途:提高对某个数据对象加锁时系统的检查效率
如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁
对任一结点加基本锁,必须先对它的上层结点加意向锁。
IS意向共享锁:如果对一个数据对象加IS锁,表示它的后裔结点拟(意向)加S锁。
IX意向排他锁:如果对一个数据对象加IX锁,表示它的后裔结点拟(意向)加X锁。
ISX共享意向排他锁:如果对一个数据对象加SIX锁,表示对它加S锁,再加IX锁,即SIX = S + IX。
具有意向锁的多粒度封锁方法
1.申请封锁时应该按自上而下的次序进行
2.释放封锁时则应该按自下而上的次序进行
具有意向锁的多粒度封锁方法
1.提高了系统的并发度
2.减少了加锁和解锁的开销
3.在实际的数据库管理系统产品中得到广泛应用