数据库的并发控制技术深度探索
ddatsh
没有事务处理,数据库就不能算是数据库
没有并发控制技术,事务处理也只是一个名词而已
没有并发控制,数据库的一致性就会被破坏
没有并发控制,也就无从谈起隔离性,就会出现数据异常
在并发控制技术下数据的正确得到首先保证,然后通过隔离和其他并发控制技术保证性能
大家都熟悉的三种读数据异常,脏读、不可重复读、幻读
脏读
第一步,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是在事务提交后,才释放读锁和写锁