首页 > 数据库 > 数据库开发技术 > 并发访问控制(3)--主流的并发访问控制算法
注释:如下所提及的文献,请按照索引号对应参考《分布式数据库原理、架构与实践》一书的引用参考。


在分布式事务的并发访问控制算法中,SS2PL的思想依然适用。使用全局的锁表结构和SS2PL算法,在提交阶段配合2PC,可以实现分布式事务的写原子性和数据的一致性。
如果全局只有一个中心化的事务处理协调器,则利用上述技术可以做到分布式事务的全局的可串行化。但是,这种架构的分布式事务处理机制的效率很低。
如果把全局唯一的事务处理协调器分散为多个具有相同功能的节点,即去中心化的事务处理架构,依旧利用2PL的思想,可以提高分布式事务处理机制的效率。如Spanner系统就是一个去中心化的基于2PL思想的分布式事务型数据库系统(具体可以参见第7章)。
利用2PL的原理实现的分布式事务处理机制,需要解决死锁的问题(资源死锁和通信死锁)。在分布式系统中解决死锁的代价会很大(单机系统上解决死锁的代价已经很大,基于多进程或多线程架构的现代数据库系统,解决死锁的操作可能导致系统几乎停止服务。如MySQL5.6、5.7版本中对同一个数据项并发进行更新,死锁检测操作就会导致系统几乎停止服务)。
不仅是死锁检测会消耗巨大的资源,锁机制本身带来的弊端页一直为人诟病。文献[176]认为封锁机制的弊端如下(对这些弊端的清晰认识,促使文献[176]的作者设计了OCC,即Optimistic Concurrency Control,乐观并发访问控制):
(1)封锁机制开销大:为保证可串行性,加锁协议对于不改变数据库完整性约束的只读事务,需要进行加读锁互斥并发写操作,以防止别人修改;对于可能造成死锁的加锁协议,还需要忍受死锁预防/死锁检测等机制带来的开销。
(2)封锁机制复杂:为了避免死锁,需要定制各种复杂的加锁协议,如什么时候加锁、什么时候才能释放锁,怎么保证严格性等。
(3)降低系统的并发吞吐量:
q等待I/O操作的一个事务持锁,将大幅降低系统整体的并发吞吐量。
q事务回滚完成前,加锁事务回滚时必须持有锁,直到事务回滚结束,这也将降低了系统整体的并发吞吐量。
另外,使用锁的机制进行互斥操作,对于现代操作系统而言,会引发耗时的内核态操作进而使得锁机制的效率低下。这意味着基于操作系统的锁机制中带有事务处理语义的2PL技术是不可用的。
在文献[21]的第2章详细讨论了基于锁的并发访问控制算法,尤其着重讨论了两阶段封锁协议(two-phase locking protocol,2PL)的改进算法——强两阶段封锁协议(rigorous/strong two-phase locking protocol,SS-2PL),限于篇幅,本书就不针对基于封锁的并发访问控制算法继续展开介绍了。

TO算法相关
TO(Time-stamp ordering,基于时间戳排序的并发控制技术)算法,是通过比较事务开始的时间戳值和其他事务的读写操作的时间戳值(排序)来决定冲突发生时事务该如何处理(先发生的即排序靠前的优先提交)。
事务Ti的时间戳值TS(Ti)早于事务Tj的时间戳值TS(Tj),即TS(Ti)<TS(Tj),则并发调度器必须保证产生的调度等价于事务Ti出现在事务Tj之前的某个串行调度[1]。换句话说,时间戳排序协议保证任何有冲突的读和写操作按时间戳顺序执行。而时间戳的值,是在事务开始时由数据库事务管理器直接赋予的(也许是物理时间值,也许是递增的数值),这个时间戳值不再发生变化。
在实践中,基于时间戳的并发调度算法[2]的实现原理上面已经介绍,这里不再重复。
在基于时间戳的并发控制技术中,有一项改进措施——Thomas写法则,如表4-1所示。
表4-1 Thomas 写规则
时间 |
T1 |
T2 |
说明 |
t0 |
开始 |
||
t1 |
开始 |
事务T1先于事务T2开始,提交次序应该是事务T1优先 |
|
t2 |
R(X) |
||
t3 |
R(Y) |
||
t4 |
W(Z) |
事务T2写数据项Z |
|
t5 |
W(Z) |
事务T1也写数据项Z,这个写操作可以被忽略。 因为后发生的事务的写操作会覆盖之前事务的写操作产生的值。 |
|
t6 |
提交 |
事务T1先提交,符合时间戳排序协议 |
|
t7 |
提交 |
在表4-1中,t0~t7表示时间戳值;T1和T2分别表示事务T1和事务T2;R(X)表示读变量X的值;W(X)表示写变量X的值。
Thomas写法则允许t7时刻提交事务T2,这有助于改进基于时间戳的并发控制效率,使得特定情况的写操作被“节省”并使得某种特殊的写写冲突被允许发生,因而提高了执行效率。
基于TO算法的Thomas写法则如图4-1所示。T1事务先于T2事务发生T1事务写了数据项C后提交,因为T2事务在T1事务之后提交,所以T2事务写的数据项C覆盖了T1事务写的数据项C的值。因此图4-1所示的左侧部分的效果等价于图4-1所示的右侧部分,T1事务的写操作可以被省略,即两个事务的写写冲突不会发生,写写冲突允许并发执行。

图4-1 Thomas 写规则示意图[3]
基于TO算法解决并发事务冲突的机制,其本质是使可能导致冲突的事务被回滚,这一点不同于基于锁的机制(可能导致冲突事务的执行被抑制)。但是有一点大家要注意,事务的回滚代价可能较高,尤其是对分布式事务进行的回滚,因为这种回滚是在分布式节点上进行的,所以代价会更高。
另外,在现代的数据库系统中,TO算法常常结合其他算法一起使用,如基于TO的OCC算法、基于TO的MVCC算法等。之所以能和其他算法结合,是因为不同的并发访问控制算法之间的优缺点能够互补,也就是说,TO算法可实现事务的提交顺序的调度,OCC和MVCC算法可在实现读写并发操作间互不阻塞。但是笔者认为,这种原因只是一种表象,期待有机会探寻多种并发算法能够结合使用的本质原因。
[1]TS(Ti)<TS(Tj),可简单地认为,基于时间戳并发控制技术,事务Ti早于事务Tj发生,则事务Ti的提交/中止也应该早于事务Tj的提交/中止。即时间戳排序并发控制技术是以事务的开始时间戳值决定可串行性顺序。注意:这一点,保证了事务的并发调度满足“可串行性”。
[2]源自:https://en.wikipedia.org/wiki/Timestamp-based_concurrency_control
[3] 图源自:https://en.wikipedia.org/wiki/Thomas_write_rule。



扫码加关注,知数行云,专业有深度
声明:本文禁止用于开发“任何软件程序,包括但不限于训练机器学习或人工智能(AI)系统”。
原文作者:那海蓝蓝知数行云;如有侵权,请联系管理员删除。