公开/公告号CN112182082A
专利类型发明专利
公开/公告日2021-01-05
原文格式PDF
申请/专利权人 广州巨杉软件开发有限公司;
申请/专利号CN202011015950.3
申请日2020-09-24
分类号G06F16/25(20190101);H04L29/06(20060101);G06F16/23(20190101);G06F9/46(20060101);
代理机构44202 广州三环专利商标代理有限公司;
代理人颜希文;郝传鑫
地址 510006 广东省广州市广州番禺区小谷围街中二横路22号A1009-A1010
入库时间 2023-06-19 09:26:02
技术领域
本发明涉及数据库技术领域,特别是涉及一种实现跨不同数据库引擎事务强一致性的系统及方法。
背景技术
传统的数据库引擎为了支持事务的ACID(原子性(Atomic):事务中各项操作,要么全做,要么全不做;一致性(Consistent):事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态;隔离性(Isolated):一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰;持久性(Durable):一个事务一旦被提交,它对数据库中数据的改变就是永久性的)特性,结合自身的技术特点和设计理念,建立起了自己一套独立的系统架构,但这也造成了不同数据库引擎之间,从系统架构,到内部实现,以及存储结构上都存在着巨大的差异。目前,不同的数据库引擎之间无法共享事务,事务的ACID特性只能在自己的引擎内部才能得到实现和保证,无法在引擎内部实现跨数据库的事务。
而为了实现跨数据库的事务能力,目前的解决方案是依赖XA分布式事务协议(由X/Open组织提出的分布式事务的规范。由全局事务管理器负责管理和协调事务,一般使用二阶段提交协议与数据库引擎进行交互),由数据库引擎上层作为协调者,负责协调各个不同的数据库引擎,当某个数据库引擎执行事务失败时,同时需要回滚其它数据库引擎上的事务。但是所述XA分布式事务协议还存在以下问题:
1、性能问题:所有数据库引擎在事务提交阶段处于同步阻塞状态,占用系统资源,容易导致性能瓶颈。
2、可靠性问题:协调者存在单点故障问题,如果协调者出现故障,数据库引擎将一直处于锁定状态。
3、数据一致性问题:在事务提交阶段,如果发生局部网络问题,一部分数据库引擎收到了提交消息,另一部分数据库引擎没收到提交消息,那么就会导致数据库引擎之间数据的不一致。
发明内容
为克服上述现有技术存在的不足,本发明之目的在于提供一种实现跨不同数据库引擎事务强一致性的系统及方法,通过共享分布式事务的方式,解决了跨不同数据库引擎事务一致性和可靠性的问题。
为达上述及其它目的,本发明提出一种实现跨不同数据库引擎事务强一致性的系统,包括:
SQL协议转换模块,用于将不同数据库引擎的请求进行SQL协议的标准化,将其解析成统一的标准协议;
事务处理模块,用于负责各数据库引擎事务的解析和执行,对不同数据库引擎发送的请求进行处理,实现不同数据库引擎之间共享数据和事务,并保证不同数据库引擎之间事务的一致;
存储模块,用于负责事务执行过程中的日志的保存,以用于后续执行事务回滚操作或事务提交操作,并对事务执行后的数据进行持久化。
优选地,所述不同数据库引擎包括但不限于MySQL、PostgreSQL以及MariaDB。
优选地,所述SQL协议转换模块对数据库引擎的请求进行解析,获取请求的关键信息,并转换为标准协议。
优选地,所述事务处理模块采用分布式设计。
优选地,所述存储模块为分布式存储模块。
为达到上述目的,本发明还提供一种实现跨不同数据库引擎事务强一致性的方法,包括如下步骤:
步骤S1,利用SQL协议转换模块将不同数据库引擎的请求进行SQL协议的标准化,将其解析成统一的标准协议;
步骤S2,利用事务处理模块负责各数据库引擎事务的解析和执行,对不同数据库引擎过来的请求进行处理,实现不同数据库引擎之间共享数据和事务,并保证不同数据库引擎之间事务的一致性;
步骤S3,将事务执行过程中的日志保存于存储模块,以用于后续执行事务回滚操作或事务提交操作,并对事务执行后的数据进行持久化。
与现有技术相比,本发明具有如下优点
1、突破了数据库引擎相互访问的壁垒,实现了跨不同数据库引擎的事务强一致性。
2、避免了业务系统跨数据库访问数据,减少了系统复杂度,提高了系统稳定性。业务系统是需要支持任何一种数据库引擎,便可以和其它数据库引擎共享事务,并实现事务的一致性,大大减化业务逻辑。通过本发明,业务系统不需要关心数据在多个不同数据库引擎之间的事务一致性问题,本发明采用共享分布式事务的方式实现跨不同数据库事务一致性,因此任何一个数据库引擎的数据是可以相互访问的,不同数据库引擎之间的事务状态是可以共享的。因此业务层只需要访问某一个数据库引擎,就能访问到其它所有引擎的数据。
附图说明
图1为本发明一种实现跨不同数据库引擎事务强一致性的系统的系统架构图;
图2为本发明一种实现跨不同数据库引擎事务强一致性的方法的步骤流程图;
图3-图5为本发明实施例的流程图。
具体实施方式
以下通过特定的具体实例并结合附图说明本发明的实施方式,本领域技术人员可由本说明书所揭示的内容轻易地了解本发明的其它优点与功效。本发明亦可通过其它不同的具体实例加以施行或应用,本说明书中的各项细节亦可基于不同观点与应用,在不背离本发明的精神下进行各种修饰与变更。
图1为本发明一种实现跨不同数据库引擎事务强一致性的系统的系统架构图。如图1所示,本发明一种实现跨不同数据库引擎事务强一致性的系统,将不同数据库引擎的事务请求和数据接入进行统一管理和执行,包括:
SQL协议转换模块101,用于将不同数据库引擎的请求进行SQL协议的标准化,将其解析成统一的标准协议,以供后续模块使用。
在本发明具体实施例中,所述标准协议指的是目前SequoiaDB已经实现的SQL协议(如Name:“student”,Query:{id:“01”},Selector:{name:1,age:1}),于步骤S1中,则是将不同SQL引擎的协议转换为SequoiaDB的协议,在此不予赘述。
在本发明中,支持的数据库引擎包括但不限于MySQL,PostgreSQL,MariaDB等。
具体地,例如有如下SQL语句(通过学生id查询学生姓名和年龄的信息):
selectname,age from student where id="01"
通过解析SQL引擎内部的数据结构,获取SQL的关键信息,其中包括:表名Name;查询条件字段id,选取的结果字段name,age,并转换为标准协议为:
Name:“student”,Query:{id:“01”},Selector:{name:1,age:1}
事务处理模块(TransactionProcessor)102,用于负责各数据库引擎事务的解析和执行,对不同数据库引擎过来的请求进行处理,实现不同数据库引擎之间共享数据和事务,并保证不同数据库引擎之间事务的一致性。在本发明具体实施例中,事务处理模块(TransactionProcessor)102采用分布式设计,以避免单点故障。
存储模块(Storage)103,用于负责事务执行过程中的undo/redo日志的保存,用于后续执行事务回滚操作,或事务提交操作,对事务执行后的数据进行持久化。在本发明具体实施例中,存储模块103是一个分布式存储模块,可以保证数据强一致性,避免单点故障。
可见,在本发明中,由于作为数据模块的存储模块是共享的,而事务状态是由数据决定的,所以也是共享的,因此实现了不同数据库引擎之间共享数据和事务。简单地说,本发明是将不同数据库引擎的协议标准化后,后续的实际操作均由同一个数据库(SequoiaDB)负责处理的,这样同一个数据库的事务状态和数据本身就是共享的,从而实现了不同数据库引擎之间共享数据和事务。
图2为本发明一种实现跨不同数据库引擎事务强一致性的方法的步骤流程图。如图2所示,本发明一种实现跨不同数据库引擎事务强一致性的方法,包括如下步骤:
步骤S1,利用SQL协议转换模块将不同数据库引擎的请求进行SQL协议的标准化,将其解析成统一的标准协议,以供后续模块使用。
在本发明具体实施例中,所述标准协议指的是目前SequoiaDB已经实现的SQL协议(如Name:“student”,Query:{id:“01”},Selector:{name:1,age:1}),于步骤S1中,则是将不同SQL引擎的协议转换为SequoiaDB的协议。
本发明中,支持的数据库引擎包括但不限于MySQL,PostgreSQL,MariaDB等。
具体地,例如有如下SQL语句(通过学生id查询学生姓名和年龄的信息):
selectname,age from student where id="01"
通过解析SQL引擎内部的数据结构,获取SQL的关键信息,其中包括:表名Name;查询条件字段id,选取的结果字段name,age,并转换为标准协议为:
Name:“student”,Query:{id:“01”},Selector:{name:1,age:1}
步骤S2,利用事务处理模块负责各数据库引擎事务的解析和执行,对不同数据库引擎过来的请求进行处理,实现不同数据库引擎之间共享数据和事务,并保证不同数据库引擎之间事务的一致性。在本发明具体实施例中,事务处理模块(TransactionProcessor)采用分布式设计,以避免单点故障。
步骤S3,将事务执行过程中的undo/redo日志保存于存储模块,以用于后续执行事务回滚操作,或事务提交操作,并对事务执行后的数据进行持久化。在本发明具体实施例中,存储模块是一个分布式存储模块,可以保证数据强一致性,避免单点故障。
以下通过各实施例说明本发明跨不同数据库引擎实现事务强一致性的过程:
在本实施例中,如图3所示,不同数据库引擎为MySQL、PostgreSQL,TransactionProcessor为事务处理模块,storage为存储模块。
1、在引擎PostgreSQL端开启一个事务t1,并往table中插入字段为c,值为‘v’的记录;事务t1写入了数据,于存储模块storage则会保存新的记录,在事务t1没有提交的情况下,本事务t1可以访问存储模块中这条新记录;但是其它事务不可以访问到这条新记录,这也是事务的隔离性的特点。
2、在引擎MySQL端开启一个事务t2,并从table中读取字段为c,值为‘v’的记录。
3、此时由于事务t1还未提交,事务t2无法看到事务t1新插入的记录{c:‘v’},因此事务t2没有查询数据。
1、如图4所示,在引擎PostgreSQL端开启一个事务t1,并往table中插入字段为c,值为‘v’的记录;
2、在该引擎PostgreSQL端提交事务t1
3、在引擎MySQL端开启一个事务t2,并从table中读取字段为c,值为‘v’的记录。
4、此时由于事务t1已经提交,因此事务t2可以看到事务t1新插入的记录{c:‘v’},因此事务t2最终查询并返回记录{c:‘v’}。
1、如图5所示,在引擎PostgreSQL端开启一个事务t1,并将table中字段为c,值为‘oldValue’的记录更新为’newValue1’
2、在引擎MySQL端开启一个事务t2,并将table中字段为c,值为‘oldValue’的记录更新为’newValue2’。
3、此时由于记录{c:‘oldValue’}已经被事务t1加锁并修改,因此事务t2无法同时修改该记录,需要等待事务t1提交事务,或者回滚事务才能继续修改。否则将会超时timeout返回失败。
综上所述,本发明一种实现跨不同数据库引擎事务强一致性的系统及方法通过将不同数据库引擎的事务请求和数据均接入到同一个分布式系统中进行统一管理和执行,突破了传统数据库引擎无法相互访问数据的限制,使得多种不同数据引擎之间可以共享数据和事务,并且实现了不同数据引擎之间的事务一致性。
与现有的XA分布式事务协议相比,本发明具有如下优点:
1、性能:在XA分布式事务协议中,SQL语句是在数据库引擎层面执行,并且上层应用需要进行协商,并等待两个数据库引擎执行完毕才能确保事务执行成功。而本发明中不同引擎的SQL都是统一下放到事务处理模块去执行,中间不需要协商和等待,性能有很大提升
2、可靠性:在XA分布式事务协议中,需要一个协调者去负责协商和等待多个数据库引擎之间的事务提交关系,一旦协调者出现故障。而本发明不需要协调者,且在事务处理模块和存储模块均采用了分布式设计,避免了单点故障
3、数据一致性:在XA分布式事务协议中,事务提交阶段如果发生局部网络问题,一部分数据库引擎收到了提交消息,另一部分数据库引擎没收到提交消息,由于数据库引擎之间的数据和事务是相互独立的,且无法直接通信和协商,会导致数据不一致。而在本发明中,当事务出现不一致时,事务处理模块中的多个节点会进行自主裁决,可以自动将事务恢复到一致状态。
上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何本领域技术人员均可在不违背本发明的精神及范畴下,对上述实施例进行修饰与改变。因此,本发明的权利保护范围,应如权利要求书所列。
机译: 通过多个ene-to-end持久化来实现跨不同媒体类型的信息和事务协调的迭代分类方法
机译: 计算机程序产品,一种在事务执行模式下实现运行时工具采样的方法和系统(在事务执行模式下实现运行时工具采样)。
机译: 一种用于在事务处理系统的事务定向系统中的事务的页面和事务中控制并发访问的方法。