并发控制概念
---------------------------------------------------------------------------------------
事务执行方式:
- 事务串行执行
- 交叉并发方式
- 同时并发方式
并发控制机制的任务:
- 对并发操作进行正确调度;
- 保证事务的隔离性;
- 保证数据库的一致性;
并发操作带来的数据不一致性:
丢失修改,不可重复读,读“脏”数据。
并发控制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰,从而避免造成数据的不一致性。
-----------------------------------------------------------------------------------------
并发控制的技术:
封锁,时间戳,乐观控制法。(商用DBMS一般采用封锁方法)
什么是封锁?
封锁就是事务T在对某个对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁。
加锁后事务T对该数据对象有了一定的控制,在事务T释放它的锁之前,其他的事务不能更新此数据对象。
基本封锁类型:排它锁(X锁,写锁)共享锁(S锁,读锁)
排它锁:若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。
共享锁:若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这样保证其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
-------------------------------------------------------------------------------------
死锁和活锁
活锁:打个比方,有一次我和一个朋友开车误闯单行道,前面有车过来,我们只能找个角落躲进去让他,无奈对面一直有车开过来的话我们就得一直等下去。
避免活锁:采用先来先服务的策略。
T1对数据加了S锁,T2要对同一个数据加X锁时就开始等待,T1释放S锁之前其他事务也对该数据加了S锁,所以T2必须等待直到该数据S锁被释放位置。
死锁:打个比方,有老板A和老板B,A跟B说你那个方案C做的不错,可否把C给我?B说可以的,你回去等我邮件传你,那么你的资料D对我们来说也挺宝贵的,可否发给我?A也说好的,回头就发邮件给你。于是A和B回去后都在想等对方先发把资料发过来,谁都不肯先发。
两个或多个事务都已封锁了一些数据对象,然后又都请求对已为其他事务封锁的数据对象加锁,从而出现死锁。
预防死锁:
一次封锁发(降低系统并发度,难于实现精确确定封锁对象)
顺序封锁发(维护成本高,难以确定事先要封锁对象)。
于是操作系统广为采用的预防死锁的策略并不是很适合数据库。
DBMS在解决死锁的问题上更普遍采用的是诊断并解除死锁的方法。
死锁的解除:
超时法:事务等待时间超过了规定的时间,就认为发生了死锁。(时间设短有可能误判,设长不能及时发现)
事务等待图法:事务等待是一个有向图G=(T,U),有环路就判定为死锁。周期性地生成事务等待图,检测事务。
解除死锁:选择一个代价最小的事务强制解除。
----------------------------------------------------------------------
并发调度可行性
可串行化调度:多个事务的并发执行时正确的,当且仅当其结果与按某一次序串行执行这些事务时的结果相同。
可串行性:是并发事务正确调度的准则,一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度。
可串行化的充分条件:一个调度Sc在保证冲突操作的次序不变的情况下,通过交换两个事务部冲突操作的次序得到另一个调度Sc`,如果Sc`是串行的,称调度Sc为冲突可串行化的调度。
一个调度是冲突可串行化,一定是可串行化的调度。
冲突操作是指不同的事务对同一个数据的读写操作和写写操作,其他操作是不冲突的。
不同事务的冲突操作和同一事务的两个操作不能交换。
冲突可串行化调度是可串行化调度的充分条件,不是必要条件。还有不满足冲突可串行化条件的可串行化调度。
两段锁协议是指所有事务必须分两个阶段对数据项加锁和解锁。
第一阶段是获得封锁,第二阶段是释放封锁。
事务遵守两段锁协议是可串行化调度的充分条件,而不是必要条件。
----------------------------------------------------------------------
封锁对象的大小成为封锁粒度
封锁的对象:逻辑单元,物理单元,
逻辑单元:属性值,属性值集合,元组,关系,索引项,整个索引,整个数据库等
物理单元:页(数据页,索引页)、物理记录等
封锁的粒度越大,并发度越小,开销越小。
封锁的粒度越小,并发度越高,开销越大。
显示封锁和隐式封锁(上级对象加锁使得该对象也加同样的锁了)
检测隐式封锁时,搜索上级节点,直到根节点,还要搜索下级节点。
意向锁:加入意向锁可提高对某个数据对象检测的效率。
如果对一个节点加意向锁,则说明该节点的下层节点正在被加锁。
对任一节点加基本锁,必须先对它的上级节点加意向锁。
意向共享锁IS
意向排他锁IX
共享意向排他锁SIX