数据库的并发控制技术深度探索

ddatsh

db #db

没有事务处理,数据库就不能算是数据库

没有并发控制技术,事务处理也只是一个名词而已

没有并发控制,数据库的一致性就会被破坏

没有并发控制,也就无从谈起隔离性,就会出现数据异常

在并发控制技术下数据的正确得到首先保证,然后通过隔离和其他并发控制技术保证性能

大家都熟悉的三种读数据异常,脏读、不可重复读、幻读

脏读

第一步,T2修改了数据行row

第二步,T1对同一个数据行row读取

第三步,T2回滚

对T1而言,读到的数据是将被回滚的数据,这就是脏读

骗子T2转帐1000元给T1,T1检查自己的账户,入账了1000元,然后T1把一件衣服卖给了骗子T2,之后骗子T2拿到衣服后回滚了转账1000元的操作,然后逃之夭夭了

T1既没有拿到钱还丢失了衣服,损失很大。越是要求高的业务,越需要避免这样的异常发生

脏写

第一步,T1修改数据行row

第二步,T2也修改数据行row并提交,数据修改生效

T2认为自己的操作是成功的。但第三步,T1回滚,用旧值替换了被T2写过的值

这意味着事务T2存入银行的钱,丢失了,帐本上只记着第一步T1读取的数据值

这就是写数据发生的数据不一致的现象

写偏序异常

两个事务写偏序

前提:医院向社会承诺,至少有一名医生对外提供电话咨询服务。但是,如果有多于两个医生在提供电话咨询,则需要某个正在进行电话咨询服务的医生停止服务

两个事务。T1发现有两个以上,请Alice停止服务;T2也发现有两个以上,请Bob停止服务

如果执行前只有Alice和Bob提供服务,两个事务执行完毕后,没有一个提供服务了。违背了“至少有一名医生对外提供电话咨询服务”的约束前提。这样也是一种数据异常现象

如果允许异常发生,这个依靠数据库做交易的世界就会发生巨大混乱——数据在,账乱了;人活着,钱没了

数据操作抽象为读操作和写操作两种,组合在一起,有四种情况

数据库里面,只有读读操作,不会引发数据异常,其他三种,都会引发数据异常

三种读异常共同点,存在并发事务;其次,并发事务操作的是同一个数据对象。再次并发事务对该数据对象,有写操作

最后一种特殊情况,对幻读而言,受谓词条件影响,这时不是操作物理上的同一个已经存在的对象,而是操作谓词限定的同一个范围内的逻辑意义上的对象

第四种情况概括为“谓词的语义”

写偏序

首先,存在并发的事务。其次,并发的事务,操作的不是同一个数据对象,和读异常不同。再次,并发的事务对不同的数据对象,有写操作,没有读读并发。最后,操作结果,违反了“语义前提”

“违反语义”是指操作数据时,需要遵守一个语义前提,例如“至少有一名医生提供服务”,但是并发操作打破了这个语义前提,出现了没有医生提供咨询的异常现象

主流并发控制技术主要包括大家熟知的两阶段锁、基于时间戳的并发控制技术、基于有效性检查的并发控制技术,以及MVCC、CO等技术

并发控制技术通常用两阶段锁方案,事务划分为加锁阶段和解锁阶段,两个阶段中间的点,称封锁点

光划分两个阶段不够,还要确定事务结束点位于哪,这个结束点和封锁点的关系是什么

并发控制协议SS2PL和S2PL差别在于释放锁的时机不同,即事务的结束点和封锁点是否重合。SS2PL是在事务提交后,才释放读锁和写锁

https://cloud.tencent.com/developer/article/1005090