【数据库事务并发】可串行化,事务优先图,2PL

网上找不到通俗且全面的文章,故在本篇文章中总结,方便自己了解

一、可串行化

        两个并发的事务,最终结果可以等效为先后执行的串行化。(先大概看看,后续再解释)

二、事务间的冲突

        包括:读写冲突、写读冲突、写写冲突

忽略图表中红色箭头

以上图为例,T1:W(A)和  T2:R(A)存在写读冲突

                      T1:W(B)和  T2:R(B)存在写读冲突

        事务间冲突仅代表:事物之间的两个操作不能交换发生顺序,一旦交换,产生的数据不一样。读写、写写冲突同理

        (和能不能串行化并无直接关系)

三、事务优先图

        功能:用于判断并行的事务之间是否能等效串行化

做法:根据第二点事务间冲突,可确定事务间某某操作存在先后关系,不可调换。

           故此可以画出有向图,即为事务优先图。(右图)

           有向边代表存在的冲突顺序,结点代表事务

解释:T1:W(A)和 T2:R(A)构成写读冲突,确定先后顺序。T2:R(B)和 T1:

            W(B)构成读写冲突,确定先后顺序。所以能画出右图的有向图。

四、能否等效可串行化

判断:画出的有向图,事务优先图是否存在环路。若不存在:代表可以序列化串行化

可以对下面两个例子动手画一画优先图

五、普通的读锁、写锁

        作用:在每次读或写数据前后加上,也就能确定并行时,事务之间某些操作的先后顺序。(能画出左边的Schedule图)

六、可串行化好处

        可以避免:数据不一致的情况,如脏读、不可重复读和幻读。(对于数据库事务四大特性:原子性、一致性、隔离性、持久性自行了解)

        脏读:读到某个事务操作的中间结果

        不可重复度:同个事务,前后对某个数的读结果不一致

        幻读:事务某次读到本该不存在的数据

七、2PL锁

概念:对于一个事务而言,总是先完成所有的上锁阶段,然后再完成所有的解锁阶段。

        作用:2PL 本身已经足够保证并发事务是可序列化的,通过 2PL 产生的多事务中,各个事务之间的依赖关系能构成有向无环图。简单理解就是一个事务的操作,只会运行一次,不会在第二时间再运行

局限:可以避免数据不一致的情况,如脏读、不可重复读和幻读。但是还存在问题:级联回滚

例子:上图中T1事务存在回滚(原子性),且整个多事务已经满足了2PL。但还是存在级联回滚

           即:T2 等待完 T1 对 A 的解锁后,执行读 A 写 A 的操作,都是根据 T1 对 A 的修改上产生的。T1 事务回滚了,T2 对 A 的操作也不算数了。

八、SS2PL锁

        在2PL锁的基础上,所有的 读锁 和 写锁 释放都应该和 事务commit 同时进行

        S2PL锁:少一个S,只规定所有的 写锁 释放和 事务commit 同时进行

作用:在2PL的基础上,可以避免级联回滚(你都commit了,保证彻底结束,原子性设为yes)

九、隔离性的总结

         事务隔离性总体可分成两个处理方法:

        加锁(悲观)

        时间戳控制(乐观):ordinary(读写时间戳)、OCC(快照校验时间戳)

参考资料:

CMU15445 (Fall 2020) 数据库系统 Project#4 - Concurrency Control 详解 - 之一Yo - 博客园

Two Phase Locking(二阶段锁) - 知乎

事务并发控制s2pl和s2pl有何区别 – PingCode

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值