一种事务处理方法、装置、电子设备及存储介质与流程

文档序号:32669221发布日期:2022-12-24 02:00阅读:25来源:国知局
1.本公开涉及数据处理
技术领域
:,具体而言,涉及一种事务处理方法、装置、电子设备及存储介质。
背景技术
::2.数据库mysql、数据传输服务(datatransmissionservice,dts)等实例间的数据复制,影响其同步性能的核心问题就是事务的并发分析,既需要能够协调事务之间的冲突,又要可以提升回放事务的并发度。3.相关技术中,主要是在主节点上可以基于写集合(writeset)和逻辑时钟的方法,将事务更新数据和事务并发相关信息记录在二进制日志(binlog)中,进而从节点根据主节点的binlog来并发回放事务,实现与主节点数据一致的目的,但是该方法,从节点并不能感知writeset的存在,从节点仅依赖binlog的事务并发相关信息,来并发回放各事务,对于有冲突的事务,需等有冲突的事务执行完才开始执行该事务,而通常一个事务整个执行过程可能耗时较长,限制了事务并发度,降低了处理效率。技术实现要素:4.本公开实施例至少提供一种事务处理方法、装置、电子设备及存储介质。5.第一方面,本公开实施例提供了一种事务处理方法,包括:6.根据主数据库的事务记录日志信息,确定当前执行事务的第一写集合,其中,所述第一写集合中包括多种类型键的键值,用于唯一表征所述当前执行事务以及所述当前执行事务中各语句;7.确定处于可执行状态的待执行事务,并根据所述主数据库的事务记录日志信息,确定所述待执行事务的第二写集合,其中,所述第二写集合中包括多种类型键的键值,用于唯一表征所述待执行事务以及所述待执行事务中各语句;8.根据所述第一写集合中各类型键的键值和所述第二写集合中各类型键的键值,判断所述待执行事务包括的各语句与所述当前执行事务是否冲突,并在确定有任一语句与所述当前执行事务不冲突时,则前置执行所述任一语句。9.一种可选的实施方式中,将所述第一写集合或所述第二写集合作为目标写集合,将所述当前执行事务或所述待执行事务作为目标事务,则根据主数据库的事务记录日志信息,确定所述目标事务的目标写集合,包括:10.根据所述主数据库的事务记录日志信息,确定所述目标事务的目标写集合包括的全局键、表键、以及,各语句的主键和/或唯一键;11.其中,所述全局键表征所述目标事务全局的锁、所述表键表征所述目标事务对应的至少一张表的表级锁;所述主键和所述唯一键表征语句锁;并且锁优先级为所述全局键大于所述表键,所述表键大于所述主键和所述唯一键。12.一种可选的实施方式中,根据所述主数据库的事务记录日志信息,确定所述目标事务的目标写集合包括的全局键、表键、以及,各语句的主键和/或唯一键,包括:13.若存在预设的目标情况,则确定所述目标事务的目标写集合包括的全局键或表键;若不存在所述目标情况,则确定所述目标事务的所述目标写集合包括的各语句的所述主键和/或唯一键;14.其中,所述目标情况包括:若所述目标事务包括数据库定义语言ddl语句或为所述事务记录日志信息包括的事务记录日志文件中的第一个事务,则确定所述目标事务的目标写集合包括所述全局键;若所述目标事务中无主键表、或包括以下至少一种目标类型表,则确定所述目标事务的所述目标写集合至少包括所述表键,其中,所述目标类型表为:有唯一索引语句的表、外键约束的父表。15.一种可选的实施方式中,根据所述第一写集合中各类型键的键值和所述第二写集合中各类型键的键值,判断所述待执行事务包括的各语句与所述当前执行事务是否冲突,包括:16.分别将所述待执行事务包括的各语句对应的第二写集合,与所述当前执行事务的所述第一写集合进行比较;17.根据锁优先级,依次判断所述待执行事务的全局键、表键、以及所述主键或所述唯一键与所述第一写集合是否有交集,在确定有交集情况下,确定对应语句与所述当前执行事务存在冲突,在确定均不存在交集情况下,确定对应语句与所述当前执行事务不冲突。18.一种可选的实施方式中,所述根据锁优先级,依次判断所述待执行事务的全局键、表键、以及所述主键或所述唯一键与所述第一写集合是否有交集,在确定有交集情况下,确定对应语句与所述当前执行事务存在冲突,在确定均不存在交集情况下,确定对应语句与所述当前执行事务不冲突,包括:19.根据锁优先级,若所述待执行事务的所述全局键与所述第一写集合存在交集,则确定所述待执行事务包括的所有语句均与所述当前执行事务冲突;20.若所述待执行事务的所述全局键与所述第一写集合不存在交集,并所述待执行事务的所述表键与所述第一写集合存在交集,则所述待执行事务的存在交集的表键下的所有语句均与所述当前执行事务冲突;21.若所述待执行事务的所述全局键、所述表键与所述第一写集合均不存在交集,并所述待执行事务的所述唯一键或所述主键与所述第一写集合存在交集,则确定存在交集的所述唯一键或所述主键对应的语句与所述当前执行事务冲突。22.一种可选的实施方式中,根据主数据库的事务记录日志信息,确定当前执行事务的第一写集合之前,还包括:23.响应于有任一事务执行完成后,根据主数据库的事务记录日志信息的逻辑时钟,确定所述当前执行事务,其中,所述当前执行事务至少包括执行完成的所述任一事务对应的下一个执行顺序的事务。24.一种可选的实施方式中,确定处于可执行状态的待执行事务,包括:25.根据主数据库的事务记录日志信息的逻辑时钟,将所述当前执行事务对应的下一个执行顺序的事务,确定为处于可执行状态的待执行事务。26.第二方面,本公开实施例还提供一种事务处理装置,包括:27.第一确定模块,用于根据主数据库的事务记录日志信息,确定当前执行事务的第一写集合,其中,所述第一写集合中包括多种类型键的键值,用于唯一表征所述当前执行事务以及所述当前执行事务中各语句;28.第二确定模块,用于确定处于可执行状态的待执行事务,并根据所述主数据库的事务记录日志信息,确定所述待执行事务的第二写集合,其中,所述第二写集合中包括多种类型键的键值,用于唯一表征所述待执行事务以及所述待执行事务中各语句;29.执行模块,用于根据所述第一写集合中各类型键的键值和所述第二写集合中各类型键的键值,判断所述待执行事务包括的各语句与所述当前执行事务是否冲突,并在确定有任一语句与所述当前执行事务不冲突时,则前置执行所述任一语句。30.第三方面,本公开可选实现方式还提供一种电子设备,包括处理器、存储器,所述存储器存储有所述处理器可执行的机器可读指令,所述处理器用于执行所述存储器中存储的机器可读指令,所述机器可读指令被所述处理器执行时,所述机器可读指令被所述处理器执行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。31.第四方面,本公开可选实现方式还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。32.本公开实施例中,根据主数据库的事务记录日志信息,确定当前执行事务的第一写集合,确定处于可执行状态的待执行事务,并根据所述主数据库的事务记录日志信息,确定所述待执行事务的第二写集合,进而根据所述第一写集合中各类型键的键值和所述第二写集合中各类型键的键值,判断所述待执行事务包括的各语句与所述当前执行事务是否冲突,并在确定有任一语句与所述当前执行事务不冲突时,则前置执行所述任一语句,这样,可以根据主数据库的事务记录日志信息,构建写集合,从而可以将待执行事务中各语句与当前执行事务进行冲突比较,实现了一种语句粒度的事务并发分析方法,可以使得待执行事务中与当前执行事务没有冲突的语句前置执行,而无需等待该语句所属待执行事务与当前执行事务都没有冲突了再执行,降低了冲突等待时间,在保证没有并发冲突情况下,最大限度地提升了回放事务的并发度,提高了处理效率。33.关于上述事务处理装置、电子设备、及计算机可读存储介质的效果描述参见上述事务处理方法的说明,这里不再赘述。34.应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,而非限制本公开的技术方案。35.为使本公开的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。附图说明36.为了更清楚地说明本公开实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,此处的附图被并入说明书中并构成本说明书中的一部分,这些附图示出了符合本公开的实施例,并与说明书一起用于说明本公开的技术方案。应当理解,以下附图仅示出了本公开的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。37.图1示出了相关技术中mysql主从复制原理示意图;38.图2示出了本公开实施例所提供的事务处理方法的流程图;39.图3示出了本公开实施例所提供的锁优先级示意图;40.图4示出了本公开实施例所提供的事务处理的应用场景示意图;41.图5示出了本公开实施例所提供的事务处理装置的示意图;42.图6示出了本公开实施例所提供的一种电子设备的示意图。具体实施方式43.可以理解的是,在使用本公开各实施例公开的技术方案之前,均应当依据相关法律法规通过恰当的方式对本公开所涉及个人信息的类型、使用范围、使用场景等告知用户并获得用户的授权。44.为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。通常在此处描述和示出的本公开实施例的组件可以以各种不同的配置来布置和设计。因此,以下对本公开的实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。45.为便于对本公开技术方案的理解,首先对本公开实施例中的技术用语加以说明:46.数据传输服务(datatransmissionservice,dts):是某厂商提供的实时数据流服务,支持关系型数据库、非关系型的数据库、数据多维分析等数据源间的数据交互,包括数据同步、迁移、订阅、集成、加工等服务。47.事务:是数据库管理系统在执行操作过程中的一个逻辑单位,由一个有限的数据库操作序列构成,是数据库管理系统操作的最小执行单元,可以理解为一个最小的不可再分的工作单元,通常一个事务对应一个完整的业务,一个完整的业务通常由多条数据操纵语言(datamanipulationlanguage,dml)语句共同联合完成,实际中通常一个事务可以包括多个表,一个表中可以包括多条语句。48.二进制日志(binlog):binlog是mysql非常重要的日志,记录了所有的数据库定义语言(datadefinitionlanguage,ddl)和dml语句(除了数据查询语句select),还包含语句所执行消耗的时间,通常binlog主要包括两类文件:二进制日志索引文件,用于记录所有的二进制文件,以及二进制日志文件,用于记录数据库所有的ddl和dml(除了数据查询语句select)语句事件,例如,本公开实施例中主数据库的事务记录日志信息即可以为binlog,事务记录日志信息中包括多个事务记录日志文件。49.ddl语句:主要命令包括创建(create)、修改(alter)、丢弃(drop)等,ddl主要是用于定义或改变表的结构、数据类型、表之间的连接和约束等初始工作,通常在建表时使用。50.dml语句:主要命令包括选择(select)、更新(update)、插入(insert)、删除(delete)等,用于对数据库里的数据进行操作。51.日志序号(logsequencenumber,lsn):表示事务的逻辑序列号,主要用于标识在binlog中的位置,用来维护数据库一致性和完整性,还对于分区数据库环境中的落实和回滚操作、崩溃和前滚恢复以及数据库操作同步起非常重要的作用,lsn的值会随着每个事务的写入而逐渐递增,每次新的binlog中lsn的值会重新开始计数。52.上次提交完成的日志序号(lastcommittedlsn):表示当前事务在完成准备(prepare),开始提交(commit)前的最大已提交的lsn,即当前事务所依赖的上次事务的lsn,可以简单地理解为,如果小于等于当前事务lastcommittedlsn的事务已执行完成,则该当前事务就可以开始执行,lastcommittedlsn相同的事务可以分到一组,表示互不冲突可以并行执行或回放。53.写集合(writeset):writeset是一种更细粒度的事务冲突检测技术,它是在逻辑时钟的基础上,对事务的lastcommittedlsn进行处理,其基本原理为:a)没有数据冲突的事务可以并发写入;b)事务的writeset存在交集说明有数据冲突;c)writeset表示事务变更或依赖的行键哈希值(rowkeyhash)的集合,具体包括表示为:若某个事务为t,该事务t包括n行(n条语句),则t={r1,…,rn},},其中,ri为事务t的第i行,prikey表示主键,uniqkey表示唯一键,foreignkey表示外键。54.d)为便于计算,可以将每个rowkey导出成设定格式来计算hash值,例如可以为如下设定格式:55.表1.[0056][0057]主键(primarykey):如果一列唯一地标识表中的每行,则该列可以称为表的主键,一张表中仅允许使用一个主键,即仅能指定一列作为主键,主键不接受重复的值和null值,即每行的主键的键值不相同并且不为空值。[0058]唯一键(uniquekey):唯一键也可以唯一标识表中的每行,与主键不同的是,唯一键允许null值,并且一张表中也可以有多个唯一键,即可以将多列作为唯一键。[0059]外键(foreignkey):外键用于与其它表关联。[0060]经研究发现,数据库mysql、数据传输服务(datatransmissionservice,dts)等实例间的数据复制,影响其同步性能的核心问题就是事务的并发分析,既需要能够协调事务之间的冲突,又要可以提升回放事务的并发度。[0061]相关技术中,可以在binlog基础上引入逻辑时钟和writeset来处理多事务并发问题,例如,参阅图1所示,为相关技术中mysql主从复制原理示意图,主节点(master)将事务更新和事务并发相关信息记录在binlog中,binlog可以有多个,当从节点(slave)与主节点正常连接时,主节点可以将更新的binlog同步到从节点,从节点的输入/输出(input/output,i/o)线程可以读取主节点的binlog并拷贝至本地中继日志(relaylog)中,从节点的sql线程从本地读取relaylog,将在主节点上提交的事务在本地回放,可以通过多个工作(worker)线程来执行事务,实现与主节点的主数据库的数据保持一致的目的。[0062]为提升事务并发性能,mysql5.7引入了逻辑时钟(logicclock,lc)机制,这种方法的原理主要是在binlog中增加lsn和lastcommittedlsn两个提示(hint)字段以用于给从节点提供数据并发性的信息。在mysql5.7.21后,在lc的基础上,新增了writeset机制,并且writeset机制是一个可以开关的功能,如果开启,主节点就可以对事务进行writeset分析,以提升逻辑时钟的并发效果,其基本原理是通过计算事务的primarykey,uniquekey和foreignkey,获得事务的writeset,然后通过writeset比较来判断事务之间的冲突依赖,如果两个事务的writeset有交集,则该两个事务有冲突,但是,因为mysql的一些遗留特性,仅靠writeset分析是无法完成事务的数据冲突的,例如外键的cascade、更新(update)、删除(delete)等操作,因此,相关技术中mysqlwriteset仅是用在主节点上的一个优化方法,mysql通过writeset来优化binlog中的lastcommittedlsn信息,从节点并不会感知writeset的存在,其实现效果实际上是做小lastcommittedlsn,使得不冲突的事务可以具有相同的lastcommittedlsn,可以并发执行,提升并发度。[0063]但是相关技术的方法,从节点仅依赖binlog的逻辑时钟来确定各事务的执行顺序,对于有冲突的事务,需等有冲突的事务执行完才开始执行该事务,而一个事务可能会涉及读取数据、业务验算和更新数据等操作,整个执行过程可能耗时较长,会使得业务处理吞吐量受到制约,限制了事务回放的并发度,降低了处理效率。[0064]基于上述研究,本公开提供了一种事务处理方法,根据主数据库的事务记录日志信息,确定当前执行事务的第一写集合,并确定处于可执行状态的待执行事务,并根据主数据库的事务记录日志信息,确定待执行事务的第二写集合,进而可以根据第一写集合中各类型键的键值和第二写集合中各类型键的键值,判断待执行事务包括的各语句与当前执行事务是否冲突,并在确定有任一语句与当前执行事务不冲突时,则前置执行该任一语句,这样,通过确定当前执行事务和处于可执行状态的待执行事务的写集合,可以实现待执行事务的语句与当前执行事务的冲突分析,语句不冲突即可并发执行,而不需要等到所有冲突的事务都执行完再开始执行该待执行事务,使得待执行事务中不冲突的语句能够前置执行,极大降低了冲突等待时间,提升了事务回放的并发度。[0065]针对以上方案所存在的缺陷,均是发明人在经过实践并仔细研究后得出的结果,因此,上述问题的发现过程以及下文中本公开针对上述问题所提出的解决方案,都应该是发明人在本公开过程中对本公开做出的贡献。[0066]应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。[0067]为便于对本实施例进行理解,首先对本公开实施例所公开的一种事务处理方法进行详细介绍,本公开实施例所提供的事务处理方法的执行主体一般为具有一定计算能力的电子设备,该电子设备例如包括:终端设备或服务器或其它处理设备,终端设备可以为用户设备(userequipment,ue)、移动设备、用户终端、蜂窝电话、无绳电话、个人数字助理(personaldigitalassistant,pda)、手持设备、计算设备、车载设备、可穿戴设备等,其中,个人数字助理是一种手持式电子设备,具有电子计算机的某些功能,可以用来管理个人信息,也可以上网浏览,收发电子邮件等,一般不配备键盘,也可以称为掌上电脑。在一些可能的实现方式中,该事务处理方法可以通过处理器调用存储器中存储的计算机可读指令的方式来实现。[0068]下面以执行主体为服务器为例对本公开实施例提供的事务处理方法加以说明。[0069]参见图2所示,为本公开实施例提供的事务处理方法的流程图,所述方法:[0070]s201:根据主数据库的事务记录日志信息,确定当前执行事务的第一写集合,其中,第一写集合中包括多种类型键的键值,用于唯一表征当前执行事务以及当前执行事务中各语句。[0071]相关技术中,在回放事务过程中只能实现事务级别的冲突分析,而本公开实施例中,为了最大限度地提升并发度,直接重新构建出事务的writeset,以实现语句级别的冲突判断。[0072]具体执行该步骤s201时,本公开实施例中提供了一种可能的方式:获取主数据库的事务记录日志信息,根据主数据库的事务记录日志信息,确定当前执行事务的第一写集合。[0073]其中,事务记录日志信息例如为binlog,binlog中记录了主数据库中所有数据的变化,因此,本公开实施例中可以基于binlog来计算writeset。[0074]当然,本公开实施例中,当前执行事务并不限制是一个还是多个,若当前执行事务有多个,这时需要分别计算各个当前事务的第一写集合,进而之后在冲突分析时,可以将待执行事务与多个当前执行事务分别进行冲突判断,例如确定多个事务可以并发执行,则当前执行事务就会有多个,并且通常事务队列中事务数目是有限的,最多有满足并发度个事务,因此writeset的计算量也是可控的。[0075]s202:确定处于可执行状态的待执行事务,并根据主数据库的事务记录日志信息,确定待执行事务的第二写集合,其中,第二写集合中包括多种类型键的键值,用于唯一表征待执行事务以及待执行事务中各语句。[0076]执行该步骤s202时,包括:[0077]s1、确定处于可执行状态的待执行事务。[0078]具体本公开提供了一种可能的实施方式:根据主数据库的事务记录日志信息的逻辑时钟,将当前执行事务对应的下一个执行顺序的事务,确定为处于可执行状态的待执行事务。[0079]例如,事务记录日志信息为binlog,binlog中记录了每个事务的lsn和lastcommittedlsn,可以根据lsn的取值大小,确定各事务的顺序,lastcommittedlsn相同的事务表示没有冲突可以并发执行,满足逻辑时钟并发条件即表示lastcommittedlsn相同,这样,可以根据当前执行事务的lsn,以及所有未执行事务的lsn和lastcommittedlsn,确定出处于可执行状态的待执行事务,也就是说,处于可执行状态的待执行事务,可以理解为是与当前执行事务不满足逻辑时钟并发条件的事务,即与当前执行事务的lastcommittedlsn均不相同,并且是确定出的当前执行事务的最大lsn对应的下一个执行顺序的事务,即被标记为可执行状态。[0080]另外,事务记录日志信息中可以包括多个事务日志文件,每个事务日志文件有文件标识,在每个事务日志文件中事务的lsn可以重新开始计数,这时确定各事务的执行顺序时,不仅基于lsn和lastcommittedlsn的取值大小,还需要根据事务所在的事务日志文件。[0081]s2、确定待执行事务的第二写集合。[0082]具体包括一种可能的实施方式:根据主数据库的事务记录日志信息,确定待执行事务的第二写集合。[0083]s203:根据第一写集合中各类型键的键值和第二写集合中各类型键的键值,判断待执行事务包括的各语句与当前执行事务是否冲突,并在确定有任一语句与当前执行事务不冲突时,则前置执行该任一语句。[0084]本公开实施例中,当前执行事务的第一写集合和待执行事务的第二写集合,可以唯一表征事务以及事务中包括的语句,有交集即有相同的键值,则说明有冲突,没有交集即均不相同,则说明没有冲突,通过构建写集合,可以将待执行事务中的各语句与当前执行事务进行冲突判断,而不是将待执行事务与当前执行事务进行冲突判断,这样可以先开事务,只要待执行事务的语句与当前执行事务不冲突即可以先前置执行该语句。[0085]也就是说,本公开实施例中,待执行事务中任一个语句能够被执行需要满足以下条件:1)该任一语句所属事务为可执行状态,例如可以基于逻辑时钟确定是否为可执行状态;2)该任一语句与当前正在执行并且lsn小于所属事务的lastcommittedlsn的所有事务均没有冲突。[0086]进一步地,本公开实施例中还提供了一种执行上述方法的触发条件,即在执行上述步骤s201根据主数据库的事务记录日志信息,确定当前执行事务的第一写集合之前,还包括:响应于有任一事务执行完成后,根据主数据库的事务记录日志信息的逻辑时钟,确定当前执行事务,其中,当前执行事务至少包括执行完成的任一事务对应的下一个执行顺序的事务。[0087]即本公开实施例中,每当有事务执行完成,就会触发调度器重新计算当前执行事务的第一写集合并通知给处于可执行状态的待执行事务,这也是因为当有事务执行完成,说明会有新事务或新语句需要执行,当前执行事务和处于可执行状态的待执行事务会发生变化,因此需要重新进行计算以进行冲突分析,以确定可并发执行的待执行事务中的语句,让不冲突的语句能够前置执行。[0088]本公开实施例中,根据主数据库的事务记录日志信息,确定当前执行事务的第一写集合,并确定处于可执行状态的待执行事务,根据主数据库的事务记录日志信息,确定待执行事务的第二写集合,进而可以根据第一写集合中各类型键的键值和第二写集合中各类型键的键值,判断待执行事务包括的各语句与当前执行事务是否冲突,并在确定有任一语句与当前执行事务不冲突时,则前置执行该任一语句,这样,通过构建写集合,实现了一种语句粒度的事务并发分析方法,对于处于可执行状态的待执行事务,可以将待执行事务中各语句与当前执行事务进行冲突比较,各语句不用等到所属事务与当前执行事务没有冲突了再开事务执行,而可以先开事务,让事务中与当前执行事务没有冲突的语句先执行,极大降低了冲突等待时间,在保证没有冲突情况下,最大限度地提升了并发度,提高了处理效率。[0089]基于上述实施例可知,本公开实施例中,数据复制场景下,在复制节点或从节点回放事务时,可以确定出当前执行事务的第一写集合和处于可执行状态的待执行事务的第二写集合,从而可以进行语句粒度的冲突比较,以最大限度地提升并发度,针对如何确定写集合和如何基于写集合进行冲突判断,本公开还提供了一种可能的实施例,具体地下面分别进行说明。[0090]为便于理解,先对本公开实施例中如何确定写集合的基本原理进行介绍,相关技术中mysqlwriteset方法基本原理是,主节点可以基于writeset来优化binlog中关于事务并发性的lsn和lastcommittedlsn信息,然后复制节点或从节点可以通过binlog中这些信息来并发回放事务,本公开实施例中考虑可以借鉴相关技术中mysqlwriteset的思想,在复制节点或从节点上通过binlog来重新构建出事务的writeset,以进行事务并发分析,但是经研究发现,并不能直接基于binlog构建出writeset,这是因为mysql中一些隐含语义是不会包含在binlog中,在计算writeset时会存在信息不全的情况,例如几种可能的binlog中信息不全的情况:1)唯一函数索引语句,如某语句:createtablet1(c1int,c2int,uniqueindex((c1+c2))),在binlog中只记录有c1和c2的值,uniqueindex(c1+c2)是作为隐藏生成列存储在mysql中,但是并不会记录到binlog,因此当函数索引是唯一索引时,uniqueindex(c1+c2)是很难被还原的,尤其表达式还是可以支持内嵌mysql函数的。2)有外键约束语句,如cascade命令,该命令的删除操作,在删除主表时自动删除从表,但是在binlog中只有主表的删除记录,并不会有子表的删除记录。3)有唯一多值索引语句,如uniqueindexidx1((cast(c1-》'$.arr'asunsignedarray))),构建索引的仅是数据类型属性值,多次插入值时会出现重复插入错误。[0091]因此,本公开实施例中,针对基于binlog构建writeset时出现的问题,对相关技术中的writeset进行了改进,扩充了writeset的语义,提出了全局键和表键的概念,这样针对binlog中信息不全的场景,可以适当放大语句的语义,以保证并发执行的事务之间没有冲突。[0092]具体地,本公开实施例中针对确定当前执行事务的第一写集合,以及确定待执行事务的第二写集合,提供了可能的具体实施方式,第一写集合和第二写集合的计算方式是相同的,为便于统一描述,将第一写集合或第二写集合作为目标写集合,将当前执行事务或待执行事务作为目标事务,以目标写集合和目标事务为例进行说明,第一写集合对应于当前执行事务,第二写集合对应于待执行事务,则具体地,根据主数据库的事务记录日志信息,确定目标事务的目标写集合,可以包括以下实施方式:[0093]根据主数据库的事务记录日志信息,确定目标事务的目标写集合包括的全局键、表键、以及,各语句的主键和/或唯一键。[0094]其中,全局键表征目标事务全局的锁、表键表征所述目标事务对应的至少一张表的表级锁;主键和唯一键表征语句锁;并且锁优先级为全局键大于表键,表键大于主键和唯一键。[0095]本公开实施例中,目标写集合中包括多种类型键的键值,例如,可以为全局键、表键、主键、唯一键,不同类型键可以表征不同语义级别的锁,这样在针对binlog中信息不全的场景,无法唯一确定语句的语句级别锁时,为避免冲突,可以适当放大语义,生成全局键或表键。[0096]则根据主数据库的事务记录日志信息,确定目标事务的目标写集合包括的全局键、表键、以及,各语句的主键和/或唯一键,本公开实施例中还提供了一种可能的实施方式,具体可以分为以下几种场景:[0097]第一种场景:若存在预设的目标情况,则确定目标事务的目标写集合包括的全局键或表键。[0098]其中,目标情况包括:1)若目标事务包括ddl语句或为事务记录日志信息包括的事务记录日志文件中的第一个事务,则确定目标事务的目标写集合包括全局键。[0099]例如,由于ddl语句通常是用于定义或更新表的结构、数据类型、表之间的连接和约束等初始工作,ddl语句通常会涉及多个事务或表,因此为避免有冲突事务并发执行,可以针对ddl语句设置全局键,具有相同全局键的事务表示有冲突,不能并发执行,例如全局键可以为随机生成的字符串。[0100]2)若目标事务中无主键表、或包括以下至少一种目标类型表,则确定目标事务的目标写集合至少包括表键,其中,目标类型表为:有唯一索引语句的表、外键约束的父表。[0101]其中,唯一索引语句例如为唯一函数索引语句,或者为唯一多值索引语句等。[0102]即本公开实施例中,可以针对表,对于表中可能出现信息不全的情况时,构建该表的表锁,增加表级锁的语义,在计算表锁时,提供了可能的实施方式,1)可以将可能出现信息不全的语句的主键和/或唯一键作为表键,例如,若事务中有包含uniquefunctionalindex行时,则可以把这行的主键和唯一键直接升级为表键,这样本公开实施例中,在分析事务冲突时,可以认为只要更新了该表的事务都会有冲突。2)若为无主键表,系统会默认增加一个隐藏主键,在binlog中是没有记录的,则可以生成一个表键,来标识该整张表,以避免该表中数据操作冲突。[0103]即本公开实施例中,对于不会记录在binlog中的隐含语义,可以适当放大当前记录的语义,在现有writeset基础上,增加了全局键和表键,这样,可以在无法唯一确定语句时,或者由于外键导致的记录不全的情况,扩大到事务的全局锁或表锁的语义,从而可以避免事务并发的冲突,保证数据的一致性和完整性。[0104]第二种场景:若不存在目标情况,则确定目标事务的目标写集合包括的各语句的主键和/或唯一键。[0105]也就是说,对于有确定语义的语句,即可以直接构建出该语句的主键和/或唯一键,以实现对该语句的锁。[0106]基于上述实施例,本公开实施例中还提供了一种锁优先级定义,具体参阅图3所示,为本公开实施例中锁优先级示意图,如图3可知,不同类型键之间的互斥关系可以通过树形的锁结构来定义,锁优先级为全局键大于表键,表键大于主键和唯一键,相同全局键的事务之间有冲突,相同表键的表之间有冲突,相同唯一键或主键的语句之间有冲突,在进行并发冲突分析时,可以根据锁优先级依次进行比较,例如针对仅包括全局键(rootkey,rk)的锁优先级可以定义为写锁:wlock(rk),针对包括表键(tablekey,tk)的锁优先级可以定义为:读锁rlock(rk)-》写锁wlock(tk),针对包括主键(primarykey,pk)和/或唯一键(uniquekey,uk)的锁优先级可以定义为:读锁rlock(rk)-》读锁rlock(tk)-》锁lock(pk/uk)。[0107]这样,本公开实施例中实现了在事务回放时重新构建写集合,并且对于相关技术中的写集合进行改进,对于binlog中信息不全的情况,可以扩大锁语义,能够确保并发回放事务不冲突,提高事务冲突分析的准确性,从而保证与主数据库中数据的一致性和完整性。[0108]进而本公开实施例中,就可以基于确定出的写集合以及写集合中各类型键,来进行冲突分析,具体地,针对上述步骤s203中根据第一写集合中各类型键的键值和第二写集合中各类型键的键值,判断待执行事务包括的各语句与当前执行事务是否冲突,本公开提供了一种可能的实施方式:[0109]s1、分别将待执行事务包括的各语句对应的第二写集合,与当前执行事务的第一写集合进行比较。[0110]本公开实施例中,在进行事务冲突分析时,可以将待执行事务的语句与当前执行事务进行比较分析,从而判断待执行事务的语句与当前执行事务是否能够并发执行。[0111]s2、根据锁优先级,依次判断待执行事务的全局键、表键、以及主键或唯一键与第一写集合是否有交集,在确定有交集情况下,确定对应语句与当前执行事务存在冲突,在确定均不存在交集情况下,确定对应语句与当前执行事务不冲突。[0112]具体包括以下几种情况:[0113]1)根据锁优先级,若待执行事务的全局键与第一写集合存在交集,则确定待执行事务包括的所有语句均与当前执行事务冲突。[0114]也就是说,本公开实施例中,在进行事务冲突分析时,根据锁优先级,先判断待执行事务的全局键是否与第一写集合冲突,若全局键冲突,就无需再判断表键、主键和唯一键,可以认为全局键事务下的所有语句均与当前执行事务冲突。[0115]2)若待执行事务的全局键与第一写集合不存在交集,并待执行事务的表键与第一写集合存在交集,则待执行事务的存在交集的表键下的所有语句均与当前执行事务冲突。[0116]即在确定全局键不相同后,在判断待执行事务的表键是否有冲突,若表键相同则认为只要更新了该表的事务都会有冲突,该表涉及的语句都认为是有冲突,不能与当前执行事务并发执行。[0117]3)若待执行事务的全局键、表键与第一写集合均不存在交集,并待执行事务的唯一键或主键与第一写集合存在交集,则确定存在交集的唯一键或主键对应的语句与当前执行事务冲突。[0118]这样,本公开实施例中,根据主数据库的事务记录日志信息,可以构建出事务的写集合,并且在构建写集合时,通过扩展写集合的语义解决了事务记录日志信息中信息不全的问题,进而可以基于构建的写集合,进行待执行事务的语句与当前执行事务之间的事务并发分析,让不冲突的语句可以前置执行,无需等到与当前执行事务没有冲突了再开事务执行,可以先开事务,只要待执行事务中语句与当前执行事务不冲突就可以先执行,极大降低了冲突等待时间,相较于相关技术中仅依赖逻辑时钟实现的事务并发分析,提升了性能。[0119]下面采用具体应用场景对上述实施例进行说明,参阅图4所示,为本公开实施例中事务处理的应用场景示意图,如图4所示,例如有九个事务,分别为trx1、trx2、…、trx9,下面结合场景对本公开实施例中的事务处理方法进行说明。[0120]1)在t1时刻trx1、trx2、trx3在并发执行,此时当前执行事务即包括trx1、trx2、trx3。[0121]2)若在t2时刻trx1和trx3执行完了,trx2仍在执行,根据主数据库的事务记录日志信息的逻辑时钟,确定trx4可以继续执行,trx5因为逻辑时钟依赖,不满足逻辑时钟并发条件,暂时hold住,trx5被标记为可执行状态但是不能并发执行,这时,当前执行事务更新为trx2和trx4,处于可执行状态的待执行事务更新为trx5。[0122]例如,如图4中,trx5包含两个语句:插入r3操作i(r3)和更新r1操作u(r1),trx2包括一条语句:插入r1操作i(r1),trx4包括一条语句:插入r2操作i(r2),则基于本公开实施例中的事务处理方法,通过将trx5包括的语句与当前执行事务trx2和trx4进行冲突比较,确定trx5中i(r3)语句与trx2、trx4均没有冲突,确定trx5中u(r1)语句与trx2冲突,则这时可以并发执行trx5中i(r3)语句,trx5中u(r1)语句不执行。[0123]这样,本公开实施例中,在事务回放过程中,基于binlog中的事务并发信息,对于满足逻辑时钟并发条件的事务,直接并发执行满足逻辑时钟并发条件的各个事务,对于不满足逻辑时钟并发条件的事务并被标记为可执行状态,则进行语句冲突分析,将无冲突的语句可以先执行,即如上处于可执行状态的trx5的第一个语句,无需等当前执行事务执行完成后再执行,可以与当前执行事务并发执行,以语句粒度进行冲突分析,提高了并发度,并且也提升了处理效率和性能。[0124]本领域技术人员可以理解,在具体实施方式的上述方法中,各步骤的撰写顺序并不意味着严格的执行顺序而对实施过程构成任何限定,各步骤的具体执行顺序应当以其功能和可能的内在逻辑确定。[0125]基于同一发明构思,本公开实施例中还提供了与事务处理方法对应的事务处理装置,由于本公开实施例中的装置解决问题的原理与本公开实施例上述事务处理方法相似,因此装置的实施可以参见方法的实施,重复之处不再赘述。[0126]参照图5所示,为本公开实施例提供的一种事务处理的示意图,所述装置包括:[0127]第一确定模块51,用于根据主数据库的事务记录日志信息,确定当前执行事务的第一写集合,其中,所述第一写集合中包括多种类型键的键值,用于唯一表征所述当前执行事务以及所述当前执行事务中各语句;[0128]第二确定模块52,用于确定处于可执行状态的待执行事务,并根据所述主数据库的事务记录日志信息,确定所述待执行事务的第二写集合,其中,所述第二写集合中包括多种类型键的键值,用于唯一表征所述待执行事务以及所述待执行事务中各语句;[0129]执行模块53,用于根据所述第一写集合中各类型键的键值和所述第二写集合中各类型键的键值,判断所述待执行事务包括的各语句与所述当前执行事务是否冲突,并在确定有任一语句与所述当前执行事务不冲突时,则前置执行所述任一语句。[0130]一种可选的实施方式中,将所述第一写集合或所述第二写集合作为目标写集合,将所述当前执行事务或所述待执行事务作为目标事务,则根据主数据库的事务记录日志信息,确定所述目标事务的目标写集合时,第一确定模块51或第二确定模块52用于:[0131]根据所述主数据库的事务记录日志信息,确定所述目标事务的目标写集合包括的全局键、表键、以及,各语句的主键和/或唯一键;[0132]其中,所述全局键表征所述目标事务全局的锁、所述表键表征所述目标事务对应的至少一张表的表级锁;所述主键和所述唯一键表征语句锁;并且锁优先级为所述全局键大于所述表键,所述表键大于所述主键和所述唯一键。[0133]一种可选的实施方式中,根据所述主数据库的事务记录日志信息,确定所述目标事务的目标写集合包括的全局键、表键、以及,各语句的主键和/或唯一键时,第一确定模块51或第二确定模块52用于:[0134]若存在预设的目标情况,则确定所述目标事务的目标写集合包括的全局键或表键;若不存在所述目标情况,则确定所述目标事务的所述目标写集合包括的各语句的所述主键和/或唯一键;[0135]其中,所述目标情况包括:若所述目标事务包括数据库定义语言ddl语句或为所述事务记录日志信息包括的事务记录日志文件中的第一个事务,则确定所述目标事务的目标写集合包括所述全局键;若所述目标事务中无主键表、或包括以下至少一种目标类型表,则确定所述目标事务的所述目标写集合至少包括所述表键,其中,所述目标类型表为:有唯一索引语句的表、外键约束的父表。[0136]一种可选的实施方式中,根据所述第一写集合中各类型键的键值和所述第二写集合中各类型键的键值,判断所述待执行事务包括的各语句与所述当前执行事务是否冲突时,执行模块53用于:[0137]分别将所述待执行事务包括的各语句对应的第二写集合,与所述当前执行事务的所述第一写集合进行比较;[0138]根据锁优先级,依次判断所述待执行事务的全局键、表键、以及所述主键或所述唯一键与所述第一写集合是否有交集,在确定有交集情况下,确定对应语句与所述当前执行事务存在冲突,在确定均不存在交集情况下,确定对应语句与所述当前执行事务不冲突。[0139]一种可选的实施方式中,所述根据锁优先级,依次判断所述待执行事务的全局键、表键、以及所述主键或所述唯一键与所述第一写集合是否有交集,在确定有交集情况下,确定对应语句与所述当前执行事务存在冲突,在确定均不存在交集情况下,确定对应语句与所述当前执行事务不冲突时,执行模块53用于:[0140]根据锁优先级,若所述待执行事务的所述全局键与所述第一写集合存在交集,则确定所述待执行事务包括的所有语句均与所述当前执行事务冲突;[0141]若所述待执行事务的所述全局键与所述第一写集合不存在交集,并所述待执行事务的所述表键与所述第一写集合存在交集,则所述待执行事务的存在交集的表键下的所有语句均与所述当前执行事务冲突;[0142]若所述待执行事务的所述全局键、所述表键与所述第一写集合均不存在交集,并所述待执行事务的所述唯一键或所述主键与所述第一写集合存在交集,则确定存在交集的所述唯一键或所述主键对应的语句与所述当前执行事务冲突。[0143]一种可选的实施方式中,第一确定模块51还用于:在根据主数据库的事务记录日志信息,确定当前执行事务的第一写集合之前,执行以下操作:[0144]响应于有任一事务执行完成后,根据主数据库的事务记录日志信息的逻辑时钟,确定所述当前执行事务,其中,所述当前执行事务至少包括执行完成的所述任一事务对应的下一个执行顺序的事务。[0145]一种可选的实施方式中,确定处于可执行状态的待执行事务时,第二确定模块52用于:根据主数据库的事务记录日志信息的逻辑时钟,将所述当前执行事务对应的下一个执行顺序的事务,确定为处于可执行状态的待执行事务。[0146]关于装置中的各模块的处理流程、以及各模块之间的交互流程的描述可以参照上述方法实施例中的相关说明,这里不再详述。[0147]本公开实施例还提供了一种电子设备,如图6所示,为本公开实施例提供的电子设备结构示意图,包括:[0148]处理器61和存储器62;所述存储器62存储有处理器61可执行的机器可读指令,处理器61用于执行存储器62中存储的机器可读指令,所述机器可读指令被处理器61执行时,处理器61执行下述步骤:[0149]根据主数据库的事务记录日志信息,确定当前执行事务的第一写集合,其中,所述第一写集合中包括多种类型键的键值,用于唯一表征所述当前执行事务以及所述当前执行事务中各语句;[0150]确定处于可执行状态的待执行事务,并根据所述主数据库的事务记录日志信息,确定所述待执行事务的第二写集合,其中,所述第二写集合中包括多种类型键的键值,用于唯一表征所述待执行事务以及所述待执行事务中各语句;[0151]根据所述第一写集合中各类型键的键值和所述第二写集合中各类型键的键值,判断所述待执行事务包括的各语句与所述当前执行事务是否冲突,并在确定有任一语句与所述当前执行事务不冲突时,则前置执行所述任一语句。[0152]一种可选的实施方式中,将所述第一写集合或所述第二写集合作为目标写集合,将所述当前执行事务或所述待执行事务作为目标事务,则根据主数据库的事务记录日志信息,确定所述目标事务的目标写集合时,处理器61用于:[0153]根据所述主数据库的事务记录日志信息,确定所述目标事务的目标写集合包括的全局键、表键、以及,各语句的主键和/或唯一键;[0154]其中,所述全局键表征所述目标事务全局的锁、所述表键表征所述目标事务对应的至少一张表的表级锁;所述主键和所述唯一键表征语句锁;并且锁优先级为所述全局键大于所述表键,所述表键大于所述主键和所述唯一键。[0155]一种可选的实施方式中,根据所述主数据库的事务记录日志信息,确定所述目标事务的目标写集合包括的全局键、表键、以及,各语句的主键和/或唯一键时,处理器61用于:[0156]若存在预设的目标情况,则确定所述目标事务的目标写集合包括的全局键或表键;若不存在所述目标情况,则确定所述目标事务的所述目标写集合包括的各语句的所述主键和/或唯一键;[0157]其中,所述目标情况包括:若所述目标事务包括数据库定义语言ddl语句或为所述事务记录日志信息包括的事务记录日志文件中的第一个事务,则确定所述目标事务的目标写集合包括所述全局键;若所述目标事务中无主键表、或包括以下至少一种目标类型表,则确定所述目标事务的所述目标写集合至少包括所述表键,其中,所述目标类型表为:有唯一索引语句的表、外键约束的父表。[0158]一种可选的实施方式中,根据所述第一写集合中各类型键的键值和所述第二写集合中各类型键的键值,判断所述待执行事务包括的各语句与所述当前执行事务是否冲突时,处理器61用于:[0159]分别将所述待执行事务包括的各语句对应的第二写集合,与所述当前执行事务的所述第一写集合进行比较;[0160]根据锁优先级,依次判断所述待执行事务的全局键、表键、以及所述主键或所述唯一键与所述第一写集合是否有交集,在确定有交集情况下,确定对应语句与所述当前执行事务存在冲突,在确定均不存在交集情况下,确定对应语句与所述当前执行事务不冲突。[0161]一种可选的实施方式中,所述根据锁优先级,依次判断所述待执行事务的全局键、表键、以及所述主键或所述唯一键与所述第一写集合是否有交集,在确定有交集情况下,确定对应语句与所述当前执行事务存在冲突,在确定均不存在交集情况下,确定对应语句与所述当前执行事务不冲突时,处理器61用于:[0162]根据锁优先级,若所述待执行事务的所述全局键与所述第一写集合存在交集,则确定所述待执行事务包括的所有语句均与所述当前执行事务冲突;[0163]若所述待执行事务的所述全局键与所述第一写集合不存在交集,并所述待执行事务的所述表键与所述第一写集合存在交集,则所述待执行事务的存在交集的表键下的所有语句均与所述当前执行事务冲突;[0164]若所述待执行事务的所述全局键、所述表键与所述第一写集合均不存在交集,并所述待执行事务的所述唯一键或所述主键与所述第一写集合存在交集,则确定存在交集的所述唯一键或所述主键对应的语句与所述当前执行事务冲突。[0165]一种可选的实施方式中,处理器61还用于:在根据主数据库的事务记录日志信息,确定当前执行事务的第一写集合之前,执行以下操作:[0166]响应于有任一事务执行完成后,根据主数据库的事务记录日志信息的逻辑时钟,确定所述当前执行事务,其中,所述当前执行事务至少包括执行完成的所述任一事务对应的下一个执行顺序的事务。[0167]一种可选的实施方式中,确定处于可执行状态的待执行事务时,处理器61用于:根据主数据库的事务记录日志信息的逻辑时钟,将所述当前执行事务对应的下一个执行顺序的事务,确定为处于可执行状态的待执行事务。[0168]上述存储器62包括内存621和外部存储器622;这里的内存621也称内存储器,用于暂时存放处理器61中的运算数据,以及与硬盘等外部存储器622交换的数据,处理器61通过内存621与外部存储器622进行数据交换。[0169]上述指令的具体执行过程可以参考本公开实施例中所述的事务处理方法的步骤,此处不再赘述。[0170]本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法实施例中所述的事务处理方法的步骤。其中,该存储介质可以是易失性或非易失的计算机可读取存储介质。[0171]本公开实施例还提供一种计算机程序产品,该计算机程序产品承载有程序代码,所述程序代码包括的指令可用于执行上述方法实施例中所述的事务处理方法的步骤,具体可参见上述方法实施例,在此不再赘述。[0172]其中,上述计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一个可选实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一个可选实施例中,计算机程序产品具体体现为软件产品,例如软件开发包(softwaredevelopmentkit,sdk)等等。[0173]所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。在本公开所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。[0174]所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。[0175]另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。[0176]所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台电子设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read-onlymemory,rom)、随机存取存储器(randomaccessmemory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。[0177]最后应说明的是:以上所述实施例,仅为本公开的具体实施方式,用以说明本公开的技术方案,而非对其限制,本公开的保护范围并不局限于此,尽管参照前述实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本
技术领域
:的技术人员在本公开揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本公开实施例技术方案的精神和范围,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应所述以权利要求的保护范围为准。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1