事务异地并行化执行算法的设想
本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/database/transaction_parallel_algorithm.html
看了Jacky的《一种并行加载的方法》,对事务的并行化处理有了一些理解,结合我曾经的一些想法,设想了一种在异地并行化事务的算法。
场景是:本地库A,实时承受并发读写。异地库B,需要准实时同步A库的数据。异地库B每秒钟去获取本地库A上的事务到本地执行以达到一致性,极少出现回滚。
Redo Log解析这些就不考虑了,最简单的想法,把事务从A发送到B去顺序执行。
但是异地库可能要承担大量的读任务,顺序执行很影响效率,必须考虑并行化处理。
Jacky也提了几种方法,例如操作表不相关的事务可以并行化,操作同一表但不同行的事务也可以并行到多个进程每个进程按事务顺序操作一张表。
其中Merge操作的想法非常帅,但是按行分组那部分我看不怎么懂……我觉得一行最终应该可以规约为一个操作。
然后我就提下我的想法。
我首先基于这样一个考虑,B库上只要每秒从A库获取的事务执行完后数据正确即可,不要求实时一致。
首先,在A库上,需要对解析出来的事务SQL进行分析,进行Merge,从行的观点来看,同一行最终应该最多只有一种操作,否则既是可以合并。
大约有如下几种情况:
1. 一行首先被INSERT,最终又被DELETE,规约为空操作。
2. 一行首先被DELETE,最终又被INSERT,这是一种比较难规约的情况,如果能从UNDO TABLESPACE中获取UNDO信息,是可以判断是否能规约为空(删除的内容被完整插入,ID也一致的情况下既是等于没有操作)。如果ID一致,至少可以被规约为UPDATE语句。
3. 一行首先被INSERT,最终又被UPDATE,可以规约为INSERT最新的数据。
4. 一行首先被UPDATE,最终又被DELETE,可以规约为DELETE操作。
5. 一行被多次UPDATE,可以规约为最终的数据被UPDATE。
经过这些规约操作,实际上这1s内的所有事物的SQL已经可以随意的并发,因为一行中不会出现2次操作。(如果UPDATE,INSERT,DELETE的操作没有依赖过SELECT操作的结果的话)
欢迎走过路过批评指正一下。