网上找不到通俗且全面的文章,故在本篇文章中总结,方便自己了解
一、可串行化
两个并发的事务,最终结果可以等效为先后执行的串行化。(先大概看看,后续再解释)

二、事务间的冲突
包括:读写冲突、写读冲突、写写冲突

(忽略图表中红色箭头)
以上图为例,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 - 博客园
1394

被折叠的 条评论
为什么被折叠?



