并发控制概念

---------------------------------------------------------------------------------------

事务执行方式:

  1. 事务串行执行
  2. 交叉并发方式
  3. 同时并发方式

并发控制机制的任务:

  • 对并发操作进行正确调度;
  • 保证事务的隔离性;
  • 保证数据库的一致性;

并发操作带来的数据不一致性:

丢失修改,不可重复读,读“脏”数据。

并发控制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰,从而避免造成数据的不一致性。

-----------------------------------------------------------------------------------------

并发控制的技术:

封锁,时间戳,乐观控制法。(商用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

原文地址:https://www.cnblogs.com/13yan/p/2531152.html