CN118113759A - 一种分布式数据库的事务执行方法、电子设备及存储介质 - Google Patents

一种分布式数据库的事务执行方法、电子设备及存储介质 Download PDF

Info

Publication number
CN118113759A
CN118113759A CN202410304867.XA CN202410304867A CN118113759A CN 118113759 A CN118113759 A CN 118113759A CN 202410304867 A CN202410304867 A CN 202410304867A CN 118113759 A CN118113759 A CN 118113759A
Authority
CN
China
Prior art keywords
transaction
lock
auxiliary
data
line
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202410304867.XA
Other languages
English (en)
Inventor
丛阳
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Transwarp Technology Shanghai Co Ltd
Original Assignee
Transwarp Technology Shanghai Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Transwarp Technology Shanghai Co Ltd filed Critical Transwarp Technology Shanghai Co Ltd
Priority to CN202410304867.XA priority Critical patent/CN118113759A/zh
Publication of CN118113759A publication Critical patent/CN118113759A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/2458Special types of queries, e.g. statistical queries, fuzzy queries or distributed queries
    • G06F16/2471Distributed queries
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/23Updating
    • G06F16/2308Concurrency control
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/23Updating
    • G06F16/2308Concurrency control
    • G06F16/2336Pessimistic concurrency control approaches, e.g. locking or multiple versions without time stamps
    • G06F16/2343Locking methods, e.g. distributed locking or locking implementation details

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Databases & Information Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Data Mining & Analysis (AREA)
  • Fuzzy Systems (AREA)
  • Mathematical Physics (AREA)
  • Probability & Statistics with Applications (AREA)
  • Software Systems (AREA)
  • Computational Linguistics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种分布式数据库的事务执行方法、电子设备及存储介质;该方法包括:通过辅助事务接收分布式数据库入口根据操作语句确定并发送的第一待执行语句及执行序列号;基于执行序列号及流式读取阈值,通过辅助事务流式执行第一待执行语句,批量读取数据行并返回至分布式数据库入口直到读取完所有数据行,批量读取的数据行由分布式数据库入口进行数据处理,并生成待更新数据;通过主事务依次接收分布式数据库入口反馈的待更新数据及第二待执行语句,通过主事务并行执行第二待执行语句,对待更新数据进行写入,解决了分布式数据库中的单机数据库对于一些语句只能串行执行导致的内存资源不足和性能较差的问题,节省内存资源,减少执行时间。

Description

一种分布式数据库的事务执行方法、电子设备及存储介质
技术领域
本发明涉及数据库技术领域,尤其涉及一种分布式数据库的事务执行方法、电子设备及存储介质。
背景技术
分布式数据库是将业务的结构化查询语言(Structured Query Language,SQL)请求分解到多个单机数据库上执行。分布式数据库的主要架构包括:分布式数据库的入口Gate和多个单机数据库。Gate可以把用户发送的sql直接转发给各个单机数据库,在一些执行特别的sql时,Gate不能把用户发送的sql直接发给各个单机数据库。
为解决Gate不能直接将用户发送的sql直接发送给单机数据库的问题,现有的主要方法如下:Gate解析sql,得到其要更新的所有数据行存储的单机数据库集合single_db_list;对single_db_list中每一个单机数据库生成各自的加写锁读数据的read_sql_with_lock与删除数据的delete_sql;Gate在single_db_list中每一个单机数据库上开启一个单机事务,并执行各自的read_sql_with_lock,以此查询到要更新的所有数据行ori_datas保存在Gate内存中,在Gate内存中把查询到的所有数据行的分片键列的值更新得到updated_datas,根据updated_datas得到更新后的所有数据行存储的单机数据库集合updated_single_db_list,对updated_single_db_list中每一个单机数据库生成各自的插入数据的insert_sql;Gate在single_db_l ist中每一个单机数据库上执行各自的delete_sql,把要更新的数据行从单机数据库中删掉。Gate在updated_single_db_li st中每一个单机数据库上执行各自的insert_sql,把更新后的数据行插入单机数据库中。
上述方法需要Gate进程拥有足够大的内存空间,当用户sql更新的数据行数量较多时,需要从各个单机数据库中全量加锁并查询到Gate内存中,这会导致Gate进程可能由于内存资源不足而崩溃;并且,上述方法存在性能问题,当用户sql更新的数据行数量较多时,需要从各个单机数据库中全量加锁并查询到Gate之后,再从各个单机数据库中删除所有数据,然后再在各个单机数据库中插入更新后的所有数据。整个过程是串行的,在真实业务场景中,全量加锁读的时间可能由于需要等待部分数据行的行锁而较长,导致执行这个用户sql的时间较长。
发明内容
本发明提供了一种分布式数据库的事务执行方法、电子设备及存储介质,以解决分布式数据库中的单机数据库对于一些语句只能串行执行导致的内存资源不足和性能较差的问题。
根据本发明的一方面,提供了一种分布式数据库的事务执行方法,应用于分布式数据库中的单机数据库,包括:
通过辅助事务模型中的辅助事务接收分布式数据库入口根据操作语句确定并发送的第一待执行语句及执行序列号,所述辅助事务模型包括一一对应的主事务和辅助事务;
基于所述执行序列号以及预先确定的流式读取阈值,通过所述辅助事务流式执行所述第一待执行语句,批量读取数据行并返回至所述分布式数据库入口直到读取完所有数据行,其中,批量读取的数据行由所述分布式数据库入口进行数据处理,并生成待更新数据;
通过所述辅助事务模型中的主事务依次接收所述分布式数据库入口反馈的待更新数据及第二待执行语句,通过所述主事务并行执行所述第二待执行语句,对所述待更新数据进行写入。
根据本发明的另一方面,提供了一种电子设备,所述电子设备包括:
至少一个处理器,以及与所述至少一个处理器通信连接的存储器;
其中,所述存储器存储有可被所述至少一个处理器执行的计算机程序,所述计算机程序被所述至少一个处理器执行,以使所述至少一个处理器能够执行本发明任一实施例所述的分布式数据库的事务执行方法。
根据本发明的另一方面,提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机指令,所述计算机指令用于使处理器执行时实现本发明任一实施例所述的分布式数据库的事务执行方法。
本发明实施例的技术方案,单机数据库通过辅助事务模型中的辅助事务接收分布式数据库入口根据操作语句确定并发送的第一待执行语句及执行序列号,所述辅助事务模型包括一一对应的主事务和辅助事务;基于所述执行序列号以及预先确定的流式读取阈值,通过所述辅助事务流式执行所述第一待执行语句,批量读取数据行并返回至所述分布式数据库入口直到读取完所有数据行,其中,批量读取的数据行由所述分布式数据库入口进行数据处理,并生成待更新数据;通过所述辅助事务模型中的主事务依次接收所述分布式数据库入口反馈的待更新数据及第二待执行语句,通过所述主事务并行执行所述第二待执行语句,对所述待更新数据进行写入,解决了分布式数据库中的单机数据库对于一些语句只能串行执行导致的内存资源不足和性能较差的问题,本申请提供一种新的事务模型,即辅助事务模型,通过辅助事务模型中的主事务和辅助事务并行执行语句,通过辅助事务执行第一待执行语句流式读取数据行并反馈给分布式数据库入口,分布式数据库入口对数据进行处理后生成待更新数据并反馈给单机数据库,单机数据库依次接收到待更新数据和第二待执行语句,在每次接收到待更新数据和第二待执行语句后,通过主事务执行第二待执行语句实现待更新数据的写入,此时第一待执行语句可以流式读取数据行,实现了第二待执行语句和第一待执行语句的并行执行,即并行执行数据的读取和写入,节省分布式数据库入口的内存资源,减少执行时间,提高数据库性能。
应当理解,本部分所描述的内容并非旨在标识本发明的实施例的关键或重要特征,也不用于限制本发明的范围。本发明的其它特征将通过以下的说明书而变得容易理解。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是根据本发明实施例一提供的一种分布式数据库的事务执行方法的流程图;
图2是根据本发明实施例一提供的一种分布式数据库的架构图;
图3是根据本发明实施例二提供的一种分布式数据库的事务执行方法的流程图;
图4是根据本发明实施例二提供的一种通过辅助事务申请待读取数据行的行锁的流程示例图;
图5是根据本发明实施例二提供的一种唤醒等待锁的事务所在会话的流程示例图;
图6是根据本发明实施例三提供的一种分布式数据库的结构示意图;
图7是实现本发明实施例的分布式数据库的事务执行方法的电子设备的结构示意图;
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
实施例一
图1为本发明实施例一提供的一种分布式数据库的事务执行方法的流程图,本实施例可适用于并行执行分布式数据库中的事务的情况,该方法可以由分布式数据库的单机数据库来执行,该分布式数据库中的单机数据库可部署在电子设备中。
图2提供了一种分布式数据库的架构图,分布式数据库是通过将业务的结构化查询语言(Structured Query Language,SQL)请求分解到多个单机数据库上执行实现数据查询、更新等操作。分布式数据库包括客户端11、分布式数据库入口12以及至少两个单机数据库13。分布式数据库入口12即Gate,分布式数据库入口11是一个独立进程,主要负责处理客户端11的请求并分发请求到各个单机数据库13,同时负责控制分布式事务的执行流程,分布式事务会在多个单机数据库13上开启单机事务,即分布式事务包含多个单机事务,分布式事务保证严格的ACID属性。单机数据库13对分布式数据库中的数据进行存储,是一个独立进程,负责执行分布式数据库入口12下发的请求,并返回结果给分布式数据库入口12,同时负责控制单机事务的执行流程,单机数据库13使用增强的严格两阶段封锁作为单机事务的并发控制策略来保证单机事务的ACID属性,锁的粒度支持数据行级别,锁的模式支持写锁,读锁等。分布式数据库入口12接收客户端11发送的sql,将sql解析为sql1-n并发送给相应的单机数据库13,同时接收单机数据库13反馈的n个结果,汇总各单机数据库13返回的结果并返回给客户端11。
如图1所示,该方法包括:
S101、通过辅助事务模型中的辅助事务接收分布式数据库入口根据操作语句确定并发送的第一待执行语句及执行序列号,辅助事务模型包括一一对应的主事务和辅助事务。
在本实施例中,辅助事务模型具体可以理解为包含一种主事务和辅助事务的模型,提供一种流式异步执行方式。主事务和辅助事务是一一对应的,即一个主事务可以且仅可以有一个辅助事务,一个辅助事务可以且仅可以有一个主事务。主事务先于辅助事务开启,主事务可以执行任何读写数据的sql,辅助事务仅支持执行加写锁读数据的sql。主事务或者辅助事务中执行的每个读写数据sql需要包含一个序列号,同一个事务中接收到的多个sql的序列号保持单调相同或者递增。辅助事务模型可以预先启动,在需要通过主事务和辅助事务两个事务并行执行时直接使用,也可以在需要时启动,可以根据具体的使用场景确定。
操作语句可以理解为用户通过客户端所发送的数据库的操作语句,例如,更新分片键列的值的sql。第一待执行语句可以理解为分布式数据入口所发送给单机数据库执行的读取数据的语句,第一待执行语句根据操作语句确定。执行序列号可以理解为一种序列号,用于对操作语句的执行顺序进行标识,执行序列号由分布式数据库入口生成。
分布式数据库入口在接收到用户所输入的操作语句后,对操作语句进行解析,确定操作语句的具体含义、所需执行的具体操作及操作的顺序,等等,当操作语句为需要加锁读到内存中,在内存中计算得到要写入的数据然后进行写入的一类语句时(例如,更新分片键列的值的sql),为节省执行时间和资源,通过辅助事务模型并行执行。分布式数据库入口对操作语句进行解析并生成相应的第一待执行语句,分布式数据库入口维护不同操作语句所对应的执行序列号,为当前所接收到的操作语句生成执行序列号。分布式数据库入口通过解析操作语句确定与其通信的单机数据库,判断当前会话中,单机数据库上是否已经启动了辅助事务模型,若已经启动,则直接通过辅助事务模型中的辅助事务将第一待执行语句及执行序列号发送给单机数据库,单机数据库通过辅助事务接收第一待执行语句及执行序列号。若单机数据库上未启动辅助事务模型,则指示单机数据库启动辅助事务模型,即启动主事务和辅助事务,通过辅助事务模型中的辅助事务将第一待执行语句及执行序列号发送给单机数据库,单机数据库通过辅助事务接收第一待执行语句及执行序列号。
S102、基于执行序列号以及预先确定的流式读取阈值,通过辅助事务流式执行第一待执行语句,批量读取数据行并返回至分布式数据库入口直到读取完所有数据行,其中,批量读取的数据行由分布式数据库入口进行数据处理,并生成待更新数据。
在本实施例中,流式读取阈值具体可以理解为流式读取数据时每次读取的数据行的最大值。待更新数据具体可以理解为需要更新写入到单机数据库中的数据。
预先设置流式读取阈值,流式读取阈值可以设置为固定值,也可以根据操作语句的类型、数据对应的业务类型等数据设置。流式读取阈值可以由分布式数据库入口确定,在发送第一待执行语句时发送给单机数据库,也可以由单机数据库自行设置。在读取数据之前,获取流式读取阈值,通过辅助事务执行第一待执行语句批量读取数据行,在读取数据行的过程中,基于执行序列号判断每一行数据行是否可以被读取,判断过程如下:通过执行序列号判断数据行最后的修改是否由辅助事务对应的主事务按照本次操作语句执行相应数据修改时所执行,若是,则可以确定此数据行无需读取,否则,确定此数据行可以被读取。按照流式读取阈值批量读取数据行,直到读取完所有数据行。单机数据库将读取到的数据行反馈给分布式数据库入口,由分布式数据库入口进行相应的数据处理,生成待更新数据,分布式数据库将生成的待更新数据通过单机数据库的主事务发送给单机数据库,以便进行后续数据写入流程。
S103、通过辅助事务模型中的主事务依次接收分布式数据库入口反馈的待更新数据及第二待执行语句,通过主事务并行执行第二待执行语句,对待更新数据进行写入。
在本实施例中,第二待执行语句可以理解为一种由单机数据库执行的对数据进行写操作的语句,第二待执行语句由分布式数据库入口确定,例如,第二待执行语句根据操作语句和待更新数据确定。分布式数据库入口每次接收到辅助事务读取的数据行后,将其处理为待更新数据,并确定第二待执行语句,同时将第二待执行语句和待更新数据发送给单机数据库中对应的主事务,单机数据库通过主事务接收分布式数据库入口反馈的待更新数据及第二待执行语句,执行第二待执行语句将待更新数据写入到单机数据库中。
以流式读取阈值为N为例,单机数据库在批量读取数据行的过程中,每读取到N行数据行后,将读取到的N行数据行反馈给分布式数据库入口,分布式数据库入口对N行数据行进行处理并发送给单机数据库的主事务,分布式数据库入口同时将第二待执行语句通过单机数据库的主事务发送给单机数据库。单机数据库通过主事务执行第二待执行语句,将待更新数据写入到数据库中的相应位置。分布式数据库每接收到N行数据行的数据后,均将其处理为待更新数据行并发送给单机数据库的主事务执行数据写入,即单机数据库通过辅助事务执行第一待执行语句读取数据,同时通过主事务执行第二待执行语句写入数据,第一执行语句分批次返回数据,直到读取完所有数据行。单机数据库在读取完所有数据行之后通知分布式数据库入口所有数据已经读取完成。分布式数据库入口针对每一批数据,生成第一个第二待执行语句,第二个第二待执行语句,第n个第二待执行语句,第一待执行语句与各第二待执行语句并行执行。
由于第一待执行语句和第二待执行语句并行执行,即第一待执行语句读取数据过程中,第二待执行语句会对数据进行写操作,改变数据行的数据,若第一待执行数据直接读取数据行,会导致本次写入的数据被读取到,实际上本次写入的数据不应该被读取,通过执行序列号判断数据行是否被读取,可以避免读取到本次写入的数据,避免数据混乱,维护并行执行的正确性和可靠性。
本发明实施例提供的一种分布式数据库的事务执行方法,解决了分布式数据库中的单机数据库对于一些语句只能串行执行导致的内存资源不足和性能较差的问题,本申请提供一种新的事务模型,即辅助事务模型,通过辅助事务模型中的主事务和辅助事务并行执行语句,通过辅助事务执行第一待执行语句流式读取数据行并反馈给分布式数据库入口,分布式数据库入口对数据进行处理后生成待更新数据并反馈给单机数据库,单机数据库依次接收到待更新数据和第二待执行语句,在每次接收到待更新数据和第二待执行语句后,通过主事务执行第二待执行语句实现待更新数据的写入,此时第一待执行语句可以流式读取数据行,实现了第二待执行语句和第一待执行语句的并行执行,即并行执行数据的读取和写入,节省分布式数据库入口的内存资源,减少执行时间,提高数据库性能。
实施例二
图3为本发明实施例二提供的一种分布式数据库的事务执行方法的流程图,本实施例在上述实施例的基础上进行细化。如图3所示,该方法包括:
S201、通过辅助事务模型中的辅助事务接收分布式数据库入口根据操作语句确定并发送的第一待执行语句及执行序列号,辅助事务模型包括一一对应的主事务和辅助事务。
作为一个可选实施例,本可选实施例进一步优化包括:如果单机数据库与分布式数据库入口不存在第一单机事务且满足辅助事务模型启动条件,启动辅助事务模型;如果单机数据库与分布式数据库入口存在第一单机事务且满足辅助事务模型启动条件,基于第一单机事务启动辅助事务模型。
在本实施例中,第一单机事务可以理解为一种单机事务,为单机数据库与分布式数据库入口之间进行数据处理的事务。辅助事务模型启动条件可以理解为用于判断是否启动辅助事务模型的条件,辅助事务模型启动条件可以根据操作语句的类型设置,例如,操作语句为需要加锁读到内存中,在内存中计算得到要写入的数据然后进行写入的语句时,确定满足辅助事务模型启动条件。
单机数据库在启动辅助事务模型之前,可以并未开启任何事务,即并未进行数据交互,也可以与分布式数据库入口通过第一单机事务进行数据交互,执行简单的数据库语句。分布式数据库入口在接收到操作语句后,首先根据操作语句判断是否满足辅助事务模型启动条件,若满足辅助事务模型启动条件,判断单机数据库与分布式数据库入口直接是否存在第一单机事务,若存在,则基于第一单机事务启动辅助事务模型;若不存在,则直接启动辅助事务模型。
作为一个可选实施例,本可选实施例进一步对启动辅助事务模型进行优化,包括A1-A2步骤:
A1、通过第一会话接收事务启动命令和第一全局事务标识后,启动第一单机事务,并将第一单机事务的全局事务标识属性设置为第一全局事务标识,设置第一单机事务的主事务属性和辅助事务属性为空。
在本实施中,第一会话具体可以理解为一种单机数据库和分布式数据库入口之间的会话,用于向单机数据库发送数据。事务启动命令具体可以理解为指示启动单机事务的命令。第一全局事务标识为一种全局事务标识,全局事务标识可以对事务进行唯一标识,用于对分布式数据库中所创建的所有事务进行区分,全局事务标识由分布式数据库入口维护。全局事务标识属性用于存储全局事务标识。主事务属性用于存储单机事务所属的主事务,辅助事务属性用于存储单机事务所属的辅助事务。
本申请实施例为单机事务增加主事属性务和辅助事务属性,当二者都为空时,代表事务为普通事务;当主事务属性不为空时,代表事务为辅助事务,主事务属性保存的是事务所属主事务的标识;当辅助事务属性不为空时,代表事务为主事务,辅助事务属性保存的是主事务对应的辅助事务的标识。二者不能同时都不为空。
当单机数据库与分布式数据库入口不存在第一单机事务时,分布式数据库入口生成事务启动命令和第一全局事务标识,通过第一会话将事务启动命令和第一全局事务标识发送给相应的单机数据库。单机数据库通过第一会话接收事务启动命令和第一全局事务标识后,启动第一单机事务,并将第一单机事务的全局事务标识属性设置为第一全局事务标识,设置第一单机事务的主事务属性和辅助事务属性为空。
A2、启动辅助事务,并将辅助事务作为第一单机事务的辅助事务,将第一单机事务作为主事务,根据主事务和辅助事务形成辅助事务模型。
单机数据库再次启动一个事务作为辅助事务,单机数据库可以自动启动辅助事务,也可以通过接收命令启动辅助事务。将辅助事务作为第一单机事务的辅助事务,将第一单机事务作为主事务,根据主事务和辅助事务形成辅助事务模型。
作为一个可选实施例,本可选实施例进一步将基于第一单机事务启动辅助事务模型,优化为B1-B3步骤:
B1、若第一单机事务的主事务属性和辅助事务属性均为空,启动辅助事务,并将辅助事务作为第一单机事务的辅助事务,将第一单机事务作为主事务,根据主事务和辅助事务形成辅助事务模型。
在单机数据库与分布式数据库入口存在第一单机事务时,此时的第一单机事务可以是普通的事务,也可以是辅助事务模型中的事务。根据第一单机事务的主事务属性和辅助事务属性判断第一单机事务的类型。
若第一单机事务的主事务属性和辅助事务属性均为空,此时第一单机事务为普通的事务,单机数据库可以自动启动辅助事务,也可以接收分布式数据库入口的命令启动辅助事务,单机数据库在启动辅助事务后将辅助事务作为第一单机事务的辅助事务,将第一单机事务作为主事务,根据主事务和辅助事务形成辅助事务模型。
B2、若第一单机事务的主事务属性为空且辅助事务属性不为空,确定第一单机事务为主事务,确定辅助事务属性对应的辅助事务,根据主事务和辅助事务形成辅助事务模型。
若第一单机事务的主事务属性为空且辅助事务属性不为空,此时可以确定第一单机事务为主事务,从辅助事务属性中读取事务的标识,将此标识对应的事务作为主事务的辅助事务,根据主事务和辅助事务形成辅助事务模型。
B3、若第一单机事务的主事务属性不为空且辅助事务属性为空,确定第一单机事务为辅助事务,确定主事务属性对应的主事务,根据主事务和辅助事务形成辅助事务模型。
若第一单机事务的主事务属性不为空且辅助事务属性为空,确定第一单机事务为辅助事务,从主事务属性中读取事务的标识,将此标识对应的事务作为主事务,根据主事务和辅助事务形成辅助事务模型。
作为一个可选实施例,本可选实施例进一步将启动辅助事务,并将辅助事务作为第一单机事务的辅助事务,优化为C1-C2步骤:
C1、通过第二会话接收辅助事务启动命令和第二全局事务标识,启动辅助事务,设置辅助事务的主事务属性和辅助事务属性为空。
在本实施例中,第二会话具体可以理解为一种单机数据库和分布式数据库入口之间的会话,用于向单机数据库发送数据,第一会话和第二会话为两个不同的会话。辅助事务启动命令具体可以理解为指示启动辅助事务的命令。第二全局事务标识为一种全局事务标识,第二全局事务标识用于指示辅助事务的主事务的标识,即分布式数据库入口在指示单机数据库启动辅助事务时,需要向单机数据库发送第二全局事务标识,第二全局事务标识为此辅助事务对应的主事务的全局事务标识。单机数据库通过第二会话接收分布式数据库入口所发送的辅助事务启动命令和第二全局事务标识,根据辅助事务启动命令的指示启动辅助事务,并设置辅助事务的主事务属性和辅助事务属性为空。
C2、将第二全局事务标识与已启动的所有单机事务的全局事务标识属性进行匹配,若匹配成功的单机事务为第一单机事务,将辅助事务作为第一单机事务的辅助事务,设置辅助事务的主事务属性为第一单机事务的标识。
确定当前已经启动的所有单机事务的全局事务标识属性中的全局事务标识,将第二全局事务标识与获取的所有全局事务标识进行匹配,即判断全局事务标识中是否存在与第二全局事务标识相同的标识,若是,确定匹配成功,否则,匹配失败。若匹配成功,确定匹配成功的单机事务是否为第一单机事务,若否,此时未找到第一单机事务的辅助事务,重新启动辅助事务;若是,将辅助事务作为第一单机事务的辅助事务,设置辅助事务的主事务属性为第一单机事务的标识,建立辅助事务和主事务之间的关系,在后续数据交互过程中,可以直接使用辅助事务模型。在实际应用过程中,启动第一单机事务的辅助事务时,将第一单机事务的标识作为第二全局事务标识发送给单机数据库,即第一全局事务标识和第二全局事务标识相同,可以启动辅助事务模型。
对于单机数据库来说,其在启动任意一个事务的辅助事务时,均可以下述流程实现:通过会话接收分布式数据库入口发送的辅助事务启动命令与其对应的主事务的全局事务标识(即第二全局事务标识),启动辅助事务,设置主事务和辅助事务属性为空;通过接收到的主事务的全局事务标识与已开启的事务的全局事务标识属性做匹配,如果匹配到了全局事务标识相同的事务且其辅助事务属性为空,则设置匹配到的事务的辅助事务为本次启动的辅助事务,同时设置本次启动辅助事务的主事务属性为匹配到的事务的标识。
本申请实施例由于第一单机事务的主事务属性和辅助事务属性均为空,因此,在确定匹配成功的单机事务为第一单机事务时,可以不再判断第一单机事务的辅助事务属性是否为空。在实际应用过程中,也可以再次判断第一单机事务的辅助事务属性是否为空。
单机事务启动之后,在其会话中顺序接收分布式数据库入口发送的多个读写数据的sql,所述会话是指单机数据库处理此单机事务的固定线程。每次接收到读写数据的sql,当前会话会处理此sql,并返回处理结果给发送此sql的分布式数据库入口,然后才可以接收到下一个读写数据的sql。此处所描述的sql可以是第一待执行语句或者第二待执行语句。第一待执行语句和第二待执行语句可以通过下述的方式对数据进行读或者写。
S202、通过辅助事务解析第一待执行语句,确定至少一个待读取数据行。
在本实施例中,待读取数据行具体可以理解为需要读取的数据行。单机数据库通过辅助事务解析第一待执行语句,确定需要读取的数据行,将此部分数据行作为待读取数据行。待读取数据行的数量可以是一行或者多行,通常是多行。
S203、针对每个待读取数据行,通过辅助事务申请待读取数据行的行锁,在行锁申请成功后,通过辅助事务结合执行序列号判断是否将待读取数据行加入到返回集合中。
在本实施例中,返回集合可以理解为存储需要反馈给分布式数据库入口的数据的集合,返回集合中存储的数据为读取到的数据行。
对于每个待读取数据行,确定待读取数据行对应的行锁类型,通过辅助事务申请行锁,在申请行锁时,判断数据行是否已经存在相应类型的行锁,若已经存在,可直接作为本次使用的行锁,也可以之间创建新的行锁,等等。在行锁申请成功后,通过辅助事务读取待读取数据行,在读取数据行之前,通过执行序列号判断待读取数据行是否由本次执行的操作语句对应的第二待执行语句写入,若是,确定不读取此待读取数据行,无需将此待读取数据行加入到返回集合中,直接处理下一待读取数据行;若否,确定读取此待读取数据行,将此待读取数据行加入到返回集合中,即将待读取数据行中的数据加入到返回集合中,并继续处理下一待读取数据行。
S204、当返回集合中的待读取数据行的个数等于流式读取阈值,通过辅助事务将返回集合中的所有待读取数据行反馈给分布式数据库入口直到读取完所有数据行,其中,批量读取的数据行由分布式数据库入口进行数据处理,并生成待更新数据。
实时监测返回集合中的待读取数据行的个数与流式读取阈值的大小的比较结果,例如,每将一行待读取数据行添加至返回集合后,对返回集合中的待读取数据行的个数进行累计加1,然后比较待读取数据行的个数与流式读取阈值的大小,若小于流式读取阈值,则继续判断是否将待读取数据行加入到返回集合中;若等于流式读取阈值,则通过辅助事务将返回集合中的所有待读取数据行反馈给分布式数据库入口,由分布式数据库入口进行数据处理,并生成待更新数据。判断是否读取完所有数据行,若没有,则继续读取数据行,直到读取完所有数据行,由此实现将数据行分批返回给分布式数据库入口,在读取完所有数据行之后,单机数据库可以通知分布式数据库入口所有数据行均已读取完毕。在返回数据行时,当读取到最后一批待读取数据行时,此时待读取数据行的个数可能小于流式读取阈值,如果已经检测到所有数据行均已读取完成,此时可以直接将返回集合中的所有待读取数据行返回至分布式数据库入口。即,本申请实施例在向分布式数据库入口返回读取到的数据行时,满足返回集合中的待读取数据行的个数等于流式读取阈值和读取完所有数据行中的至少一种时,即可返回。
需要知道的是,本申请实施例在对待读取数据行申请行锁并读取时,可以在读取到此待读取数据行时,为其申请行锁;也可以先申请所有待处理数据行的行锁,然后依次读取。
作为一个可选实施例,本可选实施例进一步将通过辅助事务申请待读取数据行的行锁,优化为D1-D2步骤:
D1、根据第一待执行语句确定行锁的第一目标类型;
在本实施例中,第一目标类型可以理解为一种行锁的类型,根据第一待执行语句确定。预先设置不同类型或者含义的第一待执行语句对应的行锁类型,解析第一待执行语句,确定第一待执行语句的具体含义、类型等信息,选择合适的行锁类型作为第一目标类型。本申请实施例对第一目标类型不做限定,可以是读锁,写锁等,不同的类型之间有不同的级别,有高低之分,具体定义规则不做限定,一般的,写锁的级别比读锁的级别高。
D2、判断辅助事务是否创建过待读取数据行对应的第一行锁实例且第一行锁实例的类型的级别不低于第一目标类型的级别,若是,将第一行锁实例作为待读取数据行的行锁;否则,获取辅助事务的主事务属性,根据辅助事务的主事务属性申请待读取数据行的行锁。
在本实施例中,第一行锁实例可以理解为一种行锁实例。每个事务包含行锁实例队列属性,其中包含事务创建的所有数据行的行锁实例,行锁实例包含类型属性。遍历辅助事务的行锁实例队列,判断辅助事务是否创建过待读取数据行的行锁实例,若创建过,将此行锁实例记作第一行锁实例,确定第一行锁实例的类型的级别,比较第一行锁实例的类型的级别与第一目标类型的级别的高低,若第一行锁实例的类型的级别不低于第一目标类型的级别,将第一行锁实例作为待读取数据行的行锁,即,辅助事务创建过待读取数据行的第一行锁实例且第一行锁实例的类型的级别与第一目标类型的级别相同或者更高,将第一行锁实例作为待读取数据行的行锁,完成待读取数据行的行锁的申请;否则,获取辅助事务的主事务属性,根据辅助事务的主事务属性判断辅助事务所属的主事务是否申请待读取数据行的行锁,并根据判断结果申请待读取数据行的行锁。
作为一个可选实施例,本可选实施例进一步将根据辅助事务的主事务属性申请待读取数据行的行锁,优化为E1-E3步骤:
E1、判断辅助事务的主事务属性是否不为空且主事务创建过待读取数据行对应的第二行锁实例且第二行锁实例的类型的级别不低于第一目标类型的级别,若是,执行E2,否则,执行E3。
在本实施例中,第二行锁实例可以理解为一种行锁实例。判断辅助事务的主事务属性是否为空,若不为空,则从主事务属性中获取主事务标识,确定辅助事务的主事务。当辅助事务的主事务创建过待读取数据行的行锁实例,将此行锁实例记为第二行锁实例,若第二行锁实例的类型的级别不低于第一目标类型的级别时,执行E2创建待读取数据行的行锁实例;否则,执行E3创建待读取数据行的行锁实例。
E2、创建待读取数据行的第一目标行锁实例,并将第一目标行锁实例加入到辅助事务的行锁实例队列,将第一目标行锁实例加入到待读取数据行的全局行锁实例列表。
在本实施例中,第一目标行锁实例具体可以理解为一种行锁实例,第一目标行锁实例的类型属性为第一目标类型。创建一个行锁实例,设置此行锁实例的类型属性为第一目标类型,将此行锁实例作为第一目标行锁实例,将第一目标行锁实例作为待读取数据行的行锁实例,实现待读取数据行的行锁实例的创建。将第一目标行锁实例加入到辅助事务的行锁实例队列;每个数据行都有一个独立的全局行锁实例列表,将第一目标行锁实例加入到此待读取数据行的全局行锁实例列表中,维护此待读取数据行的所有全局行锁实例。
E3、遍历待读取数据行的全局行锁实例列表与全局行锁等待事务队列,如果存在其他事务创建过或者等待待读取数据行对应的第三行锁实例且第三行锁实例的类型与第一目标类型存在冲突,将辅助事务加入到等待待读取数据行的全局行锁等待队列,设置辅助事务的等待锁类型属性为第一目标类型,根据存在冲突的事务设置辅助事务的等待事务属性,控制辅助事务对应的会话进入睡眠;如果不存在其他事务创建过或者等待待读取数据行对应的第三行锁实例或者第三行锁实例的类型与第一目标类型存在冲突,创建待读取数据行的第一目标行锁实例,并将第一目标行锁实例加入到辅助事务的行锁实例队列,将第一目标行锁实例加入到待读取数据行的全局行锁实例列表。
在步骤E3中,其他事务是指不是辅助事务的主事务的其他事务,即其他事务是指非辅助事务以及非辅助事务的主事务之外的事务。全局行锁等待队列可以理解为单机数据库中等待申请数据行的行锁的队列。等待锁类型属性中存储等待的行锁的类型,用于描述事务等待的行锁的类型;等待事务属性中所存储等待的事务,例如,事务的标识,用于表示本事务所等待的事务。
遍历待读取数据行的全局行锁实例列表与全局行锁等待事务队列,判断是否存在非辅助事务以及非辅助事务的主事务之外的其他事务创建过或者等待待读取数据行的行锁实例,若是,将此行锁实例记作第三行锁实例,判断第三行锁实例的类型与第一目标类型是否存在冲突,若存在冲突,将辅助事务加入到待读取数据行的全局行锁等待队列,全局行锁等待队列中记录着所有等等对此待读取数据行申请行锁并进行操作的事务;设置辅助事务的等待锁类型属性为第一目标类型,确定存在冲突的一个事务或者所有事务,根据存在冲突的事务确定设置辅助事务的等待事务属性,例如,设置辅助事务的等待事务属性为找到的第一个与辅助事务存在锁冲突的事务,控制辅助事务对应的会话进入睡眠,等待其它会话唤醒或者睡眠超时,超时时间可以通过系统参数配置。
冲突决定了不同事务可以同时申请相同数据行的具体行锁类型,具体逻辑不做限定,一般的,不同事务都申请读锁没有冲突,不同事务都申请写锁或者一个事务申请写锁另一个事务申请读锁有冲突。如果不存在其他事务创建过或者等待待读取数据行对应的第三行锁实例,或者存在其他事务创建过或者等待待读取数据行对应的第三行锁实例且第三行锁实例的类型与第一目标类型不存在冲突,创建一个行锁实例,设置此行锁实例的类型属性为第一目标类型,将此行锁实例作为第一目标行锁实例,将第一目标行锁实例作为待读取数据行的行锁实例,实现待读取数据行的行锁实例的创建。将第一目标行锁实例加入到辅助事务的行锁实例队列,将第一目标行锁实例加入到此待读取数据行的全局行锁实例列表中,维护此待读取数据行的所有全局行锁实例。
作为一个可选实施例,本可选实施例进一步将通过辅助事务结合执行序列号判断是否将待读取数据行加入到返回集合中,优化为F1-F2:
F1、通过辅助事务获取待读取数据行的最后修改事务,若最后修改事务不为辅助事务的主事务,通过辅助事务将待读取数据行加入到返回集合中。
每行数据行在被事务修改时,均记录最后一次修改本数据行的事务,记录事务的方式可以是记录事务的标识,或者其他唯一标识事务的信息,本申请实施例对此不进行限定。例如,对数据行中增加最后修改事务属性,通过最后修改事务属性记录最后修改此数据行的事务的标识,每当有事务对此数据行进行修改后,更新数据行的最后修改事务属性中的信息。通过辅助事务获取待读取数据行的最后修改事务,判断最后修改事务是否为辅助事务的主事务,若是,执行F2;若否,通过辅助事务将待读取数据行加入到返回集合中。
F2、若最后修改事务为辅助事务的主事务,通过辅助事务获取待读取数据行的修改序列号,若修改序列号小于执行序列号,通过辅助事务将待读取数据行加入到返回集合中。
若最后修改事务为辅助事务的主事务,则需要判断待读取数据行中的数据是否由与第一待执行语句并行执行的第二待执行语句写入,判断方式如下:通过辅助事务获取待读取数据行的修改序列号,若修改序列号小于执行序列号,则确定待读取数据行中的数据并非由与第一待执行语句并行执行的第二待执行语句写入,通过辅助事务将待读取数据行加入到返回集合中;若修改序列号不小于执行序列号,此时可以确定待读取数据行的数据被修改,而辅助事务在执行第一待执行数据读取待读取数据行时,数据不应该被第二待执行语句或者其他在第二待执行语句之后的数据库语句所修改,因此,不需要将此待读取数据行加入到返回集合中。
S205、通过辅助事务模型中的主事务依次接收分布式数据库入口反馈的待更新数据及第二待执行语句,通过主事务解析第二待执行语句,确定至少一个待写入数据行。
在本实施例中,待写入数据行可以理解为需要进行数据写入的数据行。单机数据库通过主事务接收待更新数据和第二待执行语句,由于辅助事务分批次的读取数据行,分布式数据库入口相应的批量处理数据,并将数据和第二待执行语句分批次返回给主事务,因此,主事务每次接收到待更新数据和第二待执行语句后,均需要对待更新数据进行写入。单机数据库通过主事务解析第二待执行语句,分析第二待执行语句的具体含义,确定需要进行数据写入的待写入数据行,待写入数据行的数量可以是一个或者多个,通常为多个。
S206、针对每个待写入数据行,通过主事务申请待写入数据行的行锁,基于所申请的行锁,通过主事务对待更新数据进行写入。
对于每个待写入数据行,确定待写入数据行对应的行锁类型,通过主事务申请行锁,在申请行锁时,判断数据行是否已经存在相应类型的行锁,若已经存在,可直接作为本次使用的行锁,也可以之间创建新的行锁,等等。在行锁申请成功后,通过主事务将待更新数据写入到对应的待写入数据行中,完成数据写入操作。
作为一个可选实施例,本可选实施例进一步将通过主事务申请待写入数据行的行锁,优化为G1-G2:
G1、根据第二待执行语句确定行锁的第二目标类型。
在本实施例中,第二目标类型可以理解为一种行锁的类型,根据第二待执行语句确定。预先设置不同类型或者含义的第二待执行语句对应的行锁类型,解析第二待执行语句,确定第二待执行语句的具体含义、类型等信息,选择合适的行锁类型作为第二目标类型。本申请实施例对第二目标类型不做限定,可以是读锁,写锁等,不同的类型之间有不同的级别,有高低之分,具体定义规则不做限定,一般的,写锁的级别比读锁的级别高。
G2、判断主事务是否创建过待写入数据行对应的第四行锁实例且第四行锁实例的类型的级别不低于第二目标类型的级别,若是,将第四行锁实例作为待写入数据行的行锁;否则,获取主事务的辅助事务属性,根据主事务的辅助事务属性申请待写入数据行的行锁。
在本实施例中,第四行锁实例可以理解为一种行锁实例。每个事务包含行锁实例队列属性,其中包含事务创建的所有数据行的行锁实例,行锁实例包含类型属性。遍历主事务的行锁实例队列,判断主事务是否创建过待写入数据行的行锁实例,若创建过,则将此行锁实例记作第四行锁实例,确定第四行锁实例的类型的级别,比较第四行锁实例的类型的级别与第二目标类型的级别的高低,若第四行锁实例的类型的级别不低于第二目标类型的级别,将第四行锁实例作为待写入数据行的行锁,即,主事务创建过待写入数据行的第四行锁实例且第四行锁实例的类型的级别与第二目标类型的级别相同或者更高,将第四行锁实例作为待写入数据行的行锁,完成待写入数据行的行锁的申请;否则,获取主事务的辅助事务属性,根据主事务的辅助事务属性判断主事务的辅助事务是否申请待写入数据行的行锁,并根据判断结果申请待写入数据行的行锁。
作为一个可选实施例,本可选实施例进一步将根据主事务的辅助事务属性申请待写入数据行的行锁,优化为:
H1、判断主事务的辅助事务属性是否不为空且辅助事务创建过待写入数据行对应的第五行锁实例且第五行锁实例的类型的级别不低于第二目标类型的级别,若是,执行H2,否则,执行H23。
在本实施例中,第五行锁实例可以理解为一种行锁实例。判断主事务的辅助事务属性是否为空,若不为空,则从辅助事务属性中获取辅助事务标识,确定主事务的辅助事务。当主事务的辅助事务创建过待写入数据行的行锁实例,将此行锁实例记为第五行锁实例,若第五行锁实例的类型的级别不低于第二目标类型的级别时,执行E2创建待写入数据行的行锁实例;否则,执行E3创建待写入数据行的行锁实例。
H2、创建待写入数据行的第二目标行锁实例,并将第二目标行锁实例加入到主事务的行锁实例队列,将第二目标行锁实例加入到待写入数据行的全局行锁实例列表。
在本实施例中,第二目标行锁实例具体可以理解为一种行锁实例,第二目标行锁实例的类型属性为第二目标类型。创建一个行锁实例,设置此行锁实例的类型属性为第二目标类型,将此行锁实例作为第二目标行锁实例,将第二目标行锁实例作为待写入数据行的行锁实例,实现待写入数据行的行锁实例的创建。将第二目标行锁实例加入到主事务的行锁实例队列,将第二目标行锁实例加入到此待写入数据行的全局行锁实例列表中,维护此待写入数据行的所有全局行锁实例。
H3、遍历待写入数据行的全局行锁实例列表与全局行锁等待事务队列,如果存在其他事务创建过或者等待待写入数据行对应的第六行锁实例且第六行锁实例的类型与第二目标类型存在冲突,将主事务加入到等待待写入数据行的全局行锁等待队列,设置主事务的等待锁类型属性为第二目标类型,根据存在冲突的事务设置主事务的等待事务属性,控制主事务对应的会话进入睡眠;如果不存在其他事务创建过或者等待待写入数据行对应的第六行锁实例或者第六行锁实例的类型与第二目标类型存在冲突,创建待写入数据行的第二目标行锁实例,并将第二目标行锁实例加入到主事务的行锁实例队列,将第二目标行锁实例加入到待写入数据行的全局行锁实例列表。
在步骤H3中,其他事务是指不是主事务的辅助事务的其他事务,即其他事务是指非主事务以及非主事务的辅助事务之外的事务。
遍历待写入数据行的全局行锁实例列表与全局行锁等待事务队列,判断是否存在非主事务以及非主事务的辅助事务之外的其他事务创建过或者等待待写入数据行的行锁实例,若是,将此行锁实例记作第六行锁实例,判断第六行锁实例的类型与第二目标类型是否存在冲突,若存在冲突,将主事务加入到待写入数据行的全局行锁等待队列,全局行锁等待队列中记录着所有等待对此待写入数据行申请行锁并进行操作的事务;设置主事务的等待锁类型属性为第二目标类型,确定存在冲突的一个事务或者所有事务,根据存在冲突的事务确定设置主事务的等待事务属性,例如,设置主事务的等待事务属性为找到的第一个与主事务存在锁冲突的事务,控制主事务对应的会话进入睡眠,等待其它会话唤醒或者睡眠超时,超时时间可以通过系统参数配置。
冲突决定了不同事务可以同时申请相同数据行的具体行锁类型,具体逻辑不做限定,一般的,不同事务都申请读锁没有冲突,不同事务都申请写锁或者一个事务申请写锁另一个事务申请读锁有冲突。如果不存在其他事务创建过或者等待待写入数据行对应的第六行锁实例,或者存在其他事务创建过或者等待待写入数据行对应的第六行锁实例且第六行锁实例的类型与第二目标类型不存在冲突,创建一个行锁实例,设置此行锁实例的类型属性为第二目标类型,将此行锁实例作为第二目标行锁实例,将第二目标行锁实例作为待写入数据行的行锁实例,实现待写入数据行的行锁实例的创建。将第二目标行锁实例加入到主事务的行锁实例队列,将第二目标行锁实例加入到此待写入数据行的全局行锁实例列表中,维护此待写入数据行的所有全局行锁实例。
作为一个可选实施例,本可选实施例进一步优化还包括I1-I3:
I1、当提交当前事务时,从当前事务申请的所有待处理数据行的行锁实例中选择一个待处理数据行作为待删除数据行,将待删除数据行的一个行锁实例作为待删除行锁实例。
其中,当前事务为主事务或者辅助事务,当前事务为主事务时,待处理数据行为待写入数据行,当前事务为辅助事务时,待处理数据行为待读取数据行。
在本实施例中,当前事务可以理解为当前执行的事务,当前事务可以是辅助事务模型中的主事务或者辅助事务;待处理数据行可以理解为事务提交时所需处理的数据行;待删除数据行可以理解为需要删除行锁实例的数据行;待删除行锁实例可以理解为需要删除的行锁实例。主事务和辅助事务在执行完后均可以提交,主事务和辅助事务提交流程相同;本申请实施例可以将主事务作为当前事务进行提交,此时待处理数据行为待写入数据行,本申请实施例也可以将辅助事务作为当前事务进行提交,此时待处理数据行为待读取数据行。
确定当前需要进行提交的事务,通常可以根据用户操作确定,将需要提交的主事务或者辅助事务作为当前事务。确定当前事务所申请过的所有待处理数据行的所有行锁实例,从待处理数据行中选择一个数据行作为待删除数据行,例如,按照各数据行的顺序从前到后依次选择数据行作为待删除数据行。从待删除数据行的所有行锁实例中选择一个行锁实例作为待删除行锁实例,在选择待删除行锁实例时可以从事务的行锁实例队列中找到待删除数据行的所有行锁实例,依次选择每个行锁实例分别作为待删除行锁实例。
I2、遍历待删除数据行的全局行锁实例列表,将待删除行锁实例从待删除数据行的全局行锁实例列表中删除,将待删除行锁实例从当前事务的行锁实例队列中删除。
遍历待删除数据行的全局行锁实例列表,确定全局行锁实例列表中与待删除行锁实例匹配的行锁实例,将其从全局行锁实例列表中删除;同时遍历当前事务的行锁实例队列,确定与待删除行锁实例匹配的行锁实例,将其从从行锁实例队列中删除。
I3、遍历待删除数据行的全局行锁等待队列,确定全局行锁等待队列中等待锁的事务并唤醒等待锁的事务所在的会话,直到当前事务申请的所有待处理数据行的所有行锁实例均被删除。
其中,等待锁的事务所等待的事务为当前事务。
遍历待删除数据行的全局行锁等待队列,全局行锁等待队列中记录的是等待对此待删除数据行申请行锁的事务,每个事务所等待的事务可以根据等待事务属性确定,通过等待事务属性确定所等待的事务为当前事务的一个事务,此事务即为等待锁的事务,唤醒等待锁的事务所在的会话,直到当前事务申请的所有待读取数据行的所有行锁实例均被删除。
单机事务提交时,会把当前事务申请的所有数据行的所有行锁实例删除,删除每一个行锁实例的主要流程如下:从此数据行的全局行锁实例列表中删除,且从事务的行锁实例队列中删除,删除完一个数据行的某一个行锁实例之后,会遍历此数据行的全局行锁等待队列,唤醒正在等待锁的单机事务所在的会话,对于每一个等待锁的事务wait ing_trx,如果其等待的事务的是当前事务,则唤醒等待锁的事务所在的会话。
作为一个可选实施例,本可选实施例进一步唤醒等待锁的事务所在的会话,优化为:
J1、根据等待锁的事务的等待锁类型属性获取等待锁的事务对应的等待锁类型。
在本实施例中,等待锁类型可以理解为一种行锁类型。读取等待锁的事务的等待锁类型属性,获取等待锁类型属性中保存的行锁类型,将其作为等待锁类型,即等待锁的事务等待申请的行锁类型为等待锁类型。
J2、判断是否等待锁的事务的主事务属性或辅助事务属性不为空且等待锁的事务的主事务或者辅助事务创建过待删除数据行的第七行锁实例且第七行锁实例的类型的级别不低于等待锁类型的级别,若是,通过等待锁的事务创建第三目标行锁实例;否则,如果不存在其他事务创建过待删除数据行的第八行锁实例且第八行锁实例的类型与等待锁类型存在冲突,通过等待锁的事务创建第三目标行锁实例。
在J2步骤中,其他事务指不包括等待锁的事务的主事务或者辅助事务的事务,如果等待锁的事务为主事务,其他事务不包括等待锁的事务的辅助事务;如果等待锁的事务为辅助事务,其他事务不包括等待锁的事务的主事务。第七行锁实例、第三目标行锁实例、第八行锁实例均为一种行锁实例。
判断等待锁的事务的主事务属性或辅助事务属性是否为空,等待锁的事务为主事务时,其主事务属性为空,辅助事务属性不为空,等待锁的事务为辅助事务时,其主事务属性不为空,辅助事务属性为空。下面分别对等待锁的事务为主事务和辅助事务如何创建行锁实例进行描述:
等待锁的事务为主事务时,其辅助事务属性不为空,读取辅助事务属性确定其辅助事务,判断等待锁的事务的辅助事务是否创建过待删除数据行的行锁实例,若创建过,将此行锁实例记为第七行锁实例,如果第七行锁实例的类型的级别不低于等待锁类型的级别,通过等待锁的事务创建第三目标行锁实例;若未创建过或者第七行锁实例的类型的级别低于等待锁类型的级别,判断是否存在其他事务创建过待删除数据行的行锁实例,若是,将此行锁实例记为第八行锁实例,如果第八行锁实例的类型与等待锁类型存在冲突,结束等待锁的事务的处理流程;若不存在其他事务创建过待删除数据行的第八行锁实例或者第八行锁实例的类型与等待锁类型不存在冲突,通过等待锁的事务创建第三目标行锁实例。
等待锁的事务为辅助事务时,其主事务属性不为空,读取主事务属性确定其主事务,判断等待锁的事务的主事务是否创建过待删除数据行的行锁实例,若创建过,将此行锁实例记为第七行锁实例,如果第七行锁实例的类型的级别不低于等待锁类型的级别,通过等待锁的事务创建第三目标行锁实例;若未创建过第七行锁实例或者第七行锁实例的类型的级别低于等待锁类型的级别,判断是否存在其他事务创建过待删除数据行的行锁实例,若是,将此行锁实例记为第八行锁实例,如果第八行锁实例的类型与等待锁类型存在冲突,结束等待锁的事务的处理流程;若不存在其他事务创建过待删除数据行的第八行锁实例或者第八行锁实例的类型与等待锁类型不存在冲突,通过等待锁的事务创建第三目标行锁实例。
J3、设置第三目标行锁实例的类型属性为等待锁类型,将第三目标行锁实例加入到等待锁的事务的行锁实例队列,将第三目标行锁实例加入到待删除数据行的全局行锁实例列表,将等待锁的事务从全局行锁等待列表中删除,唤醒等待锁的事务所在的会话。
作为一个可选实施例,本可选实施例进一步优化还包括K1-K2:
K1、如果等待锁的事务的主事务属性或者辅助事务属性不为空、等待锁的事务的主事务或者辅助事务在待删除数据行的行锁等待队列当中且等待的不是当前事务且等待的目标行锁类型的级别不高于等待锁类型,通过等待锁的事务的主事务或者辅助事务创建第四目标行锁实例。
在本实施例中,目标行锁类型可以理解为等待锁的事务所等待申请的行锁的类型,其同样为一种行锁类型。第四目标行锁实例为一种行锁实例。
下面按照等待锁的事务为主事务还是辅助事务分别描述行锁实例创建过程:
等待锁的事务为主事务时,其辅助事务属性不为空,读取辅助事务属性获取等待锁的事务的辅助事务,若该辅助事务在待删除数据行的行锁等待队列当中且等待的不是当前事务,读取该辅助事务的等待锁类型属性,获取该辅助事务所等待的目标行锁类型,如果目标行锁类型的级别不高于等待锁类型,通过等待锁的事务的辅助事务创建第四目标行锁实例。
等待锁的事务为辅助事务时,其主事务属性不为空,读取主事务属性获取等待锁的事务的主事务,若该主事务在待删除数据行的行锁等待队列当中且等待的不是当前事务,读取该主事务的等待锁类型属性,获取该主事务所等待的目标行锁类型,如果目标行锁类型的级别不高于等待锁类型,通过等待锁的事务的辅助事务创建第四目标行锁实例。
K2、设置第四目标行锁实例的类型属性为目标行锁类型,将第四目标行锁实例加入到等待锁的事务的主事务或者辅助事务的行锁实例队列,将第四目标行锁实例加入到待删除数据行的全局行锁实例列表,将等待锁的事务的主事务或者辅助事务从全局行锁等待列表中删除,唤醒等待锁的事务的主事务或者辅助事务所在的会话。
下面按照等待锁的事务为主事务还是辅助事务分别描述会话唤醒过程:
等待锁的事务为主事务时,设置第四目标行锁实例的类型属性为目标行锁类型,将第四目标行锁实例加入到等待锁的事务的辅助事务的行锁实例队列,将第四目标行锁实例加入到待删除数据行的全局行锁实例列表,将等待锁的事务的辅助事务从全局行锁等待列表中删除,唤醒等待锁的事务的辅助事务所在的会话。
等待锁的事务为辅助事务时,设置第四目标行锁实例的类型属性为目标行锁类型,将第四目标行锁实例加入到等待锁的事务的主事务的行锁实例队列,将第四目标行锁实例加入到待删除数据行的全局行锁实例列表,将等待锁的事务的主事务从全局行锁等待列表中删除,唤醒等待锁的事务的主事务所在的会话。
作为一个可选实施例,本可选实施例进一步优化还包括:在对数据行进行写入后,将写入的数据行的修改序列号属性更新为执行序列号,将写入的数据行的最后修改事务属性更新为主事务。
在本实施例中,修改序列号属性用于记录最后一次对数据行进行修改的数据库语句的执行序列号;最后修改事务属性用于记录最后一次对数据行进行修改的事务。
通过主事务并行执行第二待执行语句,将待更新数据写入到对应数据行之后,记录最新对数据行进行写入的操作。将本次执行的执行序列号,写入到数据行的修改序列号属性中,覆盖修改序列号属性原本记录的序列号,完成序列号的更新,执行序列号可以由分布式数据库入口发送给主事务,例如,分布式数据库入口在发送第二待执行语句的同时发送执行序列号;将主事务写入到数据行的最后修改事务属性中,覆盖最后修改事务属性中原本记录的事务,完成事务的更新。最后修改事务属性中可以存储事务的标识。
辅助事务模型通过共享行锁和执行序列号结合的方式,解决了以下问题:
1、辅助事务和其对应的主事务并行执行的锁冲突问题;辅助事务加写锁读的数据行,主事务可以并行删除,修改或者加写锁读,其他事务不可以并行删除,修改或者加写锁读。主事务写的数据行或者加写锁读的数据行,辅助事务可以并行加锁读到,其他事务不能并行加锁读到。
2、解决了辅助事务重复读的问题;辅助事务流式加写锁读时,对于由同一条操作语句生成的insert_sql插入的数据,可以加锁成功(不会由于等待锁而进入睡眠),但是不能读到。
以操作语句为更新分片键的列的值的cur_sql为例,说明分布式事务执行流程:
a.获取操作语句cur_sql的执行序列号cur_sql_sn;执行序列号为cur_sql是分布式事务中执行的第几个sql;具体的,执行序列号为用户在当前会话中的当前事务中发送的第几个sql。
b.Gate解析cur_sql,得到其要更新的所有数据行存储的单机数据库集合single_db_list。
c.Gate对single_db_list中每一个单机数据库生成各自的加写锁读数据的read_sql_with_lock,即第一待执行语句。
d.Gate在single_db_list中每一个单机数据库上并行执行以下步骤:
a).单机数据库上如果没有开启辅助事务模型,开启辅助事务模型,辅助事务模型包括一一对应的主事务和辅助事务。
b).在辅助事务中,流式执行read_sql_with_lock,并指定其执行序列号为cur_sql_sn以及流式读取阈值max_num,单机数据库以增量方式返回数据行,而非全量方式,即一批一批的返回数据行,每一批返回数据行的个数不超过max_num。
c).分布式数据库入口每次接收到一批数据行到内存中,执行以下步骤:
1.生成删除这批数据行的delete_sql。
2.在单机主事务中,执行delete_sql,并指定其执行序列号为cur_sql_sn.。
3.分布式数据库入口在内存中把查询到的这批数据行的分片键列的值更新得到updated_datas,根据updated_datas得到更新后的所有数据行存储的单机数据库集合updated_single_db_list,对updated_single_db_list中每一个单机数据库生成各自的插入数据的insert_sql。
4.分布式数据库入口在updated_single_db_list中每一个单机数据库上并行执行以下步骤:在单机数据库的主事务中,执行insert_sql,并指定其执行序列号为操作语句对应的执行序列号,即第一待执行语句对应的执行序列号。
单机数据库上如果没有开启主事务,开启一个主事务,并指定此主事务的全局事务标识为当前分布式事务的全局事务标识,本申请实施例已经启动辅助事务模型,因此可以默认主事务已经开启。也可以将辅助事务模型中的主事务和辅助事务分别在不同的时间启动。
5.分布式数据库入口在内存中删除这批数据行。
分布式数据库入口根据接收到的更新分片键列的值的一条sql生成read_sql_with_lock和write_sql,write_sql包含删除数据delete_sql和插入数据insert_sql。
分布式事务提交时,会在各个单机数据库上提交开启的主事务和辅助事务。
示例性的,图4提供了一种通过辅助事务申请待读取数据行的行锁的流程示例图。
S301、解析第一待执行语句确定行锁的第一目标类型。
S302、判断辅助事务是否创建过待读取数据行对应的第一行锁实例且第一行锁实例的类型的级别不低于第一目标类型的级别,若是,执行S303;否则,执行S304。
S303、将第一行锁实例作为待读取数据行的行锁。
通过S303步骤可以完成待读取数据行的行锁的申请。
S304、获取辅助事务的主事务属性。
S305、判断是否满足辅助事务的主事务属性不为空且主事务创建过待读取数据行对应的第二行锁实例且第二行锁实例的类型的级别不低于第一目标类型的级别,若否,执行S306;若是,执行S307。
即,如果辅助事务的主事务属性不为空且主事务创建过待读取数据行对应的第二行锁实例且第二行锁实例的类型的级别不低于第一目标类型的级别,执行S307;否则,执行S308。
S306、判断是否存在非辅助事务的主事务的其他事务创建过或者等待待读取数据行对应的第三行锁实例且第三行锁实例的类型与第一目标类型存在冲突;若否,执行S307;若是,执行S308。
即,如果存在非辅助事务的主事务的其他事务创建过或者等待待读取数据行对应的第三行锁实例且第三行锁实例的类型与第一目标类型存在冲突,执行S308;否则,执行S307。
S307、创建待读取数据行的第一目标行锁实例,设置第一目标行锁实例的类型属性为第一目标类型,将第一目标行锁实例加入到辅助事务的行锁实例队列,将第一目标行锁实例加入到待读取数据行的全局行锁实例列表。
通过S307步骤可以完成待读取数据行的行锁的申请。
S308、将辅助事务加入到等待待读取数据行的全局行锁等待队列,设置辅助事务的等待锁类型属性为第一目标类型,根据存在冲突的事务设置辅助事务的等待事务属性,控制辅助事务对应的会话进入睡眠,等待其它会话唤醒或者睡眠超时。
S309、如果辅助事务对应的会话被其他会话唤醒,读取待读取数据行;如果睡眠超时,则返回Gate等锁超时错误,结束对此待读取数据行的处理流程。
在申请到待读取数据行的行锁后,读取每一个待读取数据行,把读到的所有数据行集合返回给客户端。在主事务申请行锁进行数据写入时,完成数据写入后把写的数据行的个数返回给客户端。
同理,通过主事务申请待写入数据行的行锁的流程与图4中的流程原理相同,可参考图4,在此不再进行赘述。
示例性的,图5提供了一种唤醒等待锁的事务所在会话的流程示例图,以等待锁的事务为主事务为例。
S401、根据等待锁的事务的等待锁类型属性获取等待锁的事务对应的等待锁类型。
S402、判断是否等待锁的事务的辅助事务属性不为空且等待锁的事务的辅助事务创建过待删除数据行的第七行锁实例且第七行锁实例的类型的级别不低于等待锁类型的级别;若否,执行S403;若是,执行S405。
即,如果等待锁的事务的辅助事务属性不为空且等待锁的事务的辅助事务创建过待删除数据行的第七行锁实例且第七行锁实例的类型的级别不低于等待锁类型的级别,执行S405;否则,执行S403。
S403、判断是否存在其他事务创建过待删除数据行的第八行锁实例且第八行锁实例的类型与等待锁类型存在冲突,若是,执行S404;否则,执行S405。
即,如果存在其他事务创建过待删除数据行的第八行锁实例且第八行锁实例的类型与等待锁类型存在冲突,执行S404结束处理流程;否则,执行S405。
S404、结束等待锁的事务的处理流程。
S405、通过等待锁的事务创建第三目标行锁实例,设置第三目标行锁实例的类型属性为等待锁类型,将第三目标行锁实例加入到等待锁的事务的行锁实例队列,将第三目标行锁实例加入到待删除数据行的全局行锁实例列表,将等待锁的事务从全局行锁等待列表中删除,唤醒等待锁的事务所在的会话。
S406、如果等待锁的事务的辅助事务属性不为空且等待锁的事务的辅助事务在待删除数据行的行锁等待队列当中且等待的不是当前事务且等待的目标行锁类型的级别不高于等待锁类型,通过等待锁的事务的辅助事务创建第四目标行锁实例。
S407、设置第四目标行锁实例的类型属性为目标行锁类型,将第四目标行锁实例加入到等待锁的事务的辅助事务的行锁实例队列,将第四目标行锁实例加入到待删除数据行的全局行锁实例列表,将等待锁的事务的辅助事务从全局行锁等待列表中删除,唤醒等待锁的事务的辅助事务所在的会话。
同理,等待锁的事务为辅助事务时,唤醒等待锁的事务所在会话的流程与等待锁的事务为主事务时原理相同,可参考图5,在此不再进行赘述.
本发明实施例提供的一种分布式数据库的事务执行方法,解决了分布式数据库中的单机数据库对于一些语句只能串行执行导致的内存资源不足和性能较差的问题,并行执行第一待执行语句和第二待执行语句,实现数据的并行读取和写入,节省使用的内存资源,减少执行时间,提高数据库性能。辅助事务模型,支持流式异步执行加写锁读数据和写数据的sql语句,同时保证严格的事务ACID属性。
实施例三
图6为本发明实施例三提供的一种分布式数据库的结构示意图。如图6所示,该系统包括:分布式数据库入口51和至少两个单机数据库52,单机数据库52执行如本申请任一实施例所述的分布式数据库的事务执行方法。
单机数据库52通过辅助事务模型中的辅助事务接收分布式数据库入口根据操作语句确定并发送的第一待执行语句及执行序列号,所述辅助事务模型包括一一对应的主事务和辅助事务;
单机数据库52基于所述执行序列号以及预先确定的流式读取阈值,通过所述辅助事务流式执行所述第一待执行语句,批量读取数据行并返回至所述分布式数据库入口直到读取完所有数据行;
分布式数据库入口51对批量获取到的数据行进行数据处理,生成待更新数据并反馈给单机数据库52;
单机数据库52通过所述辅助事务模型中的主事务依次接收所述分布式数据库入口反馈的待更新数据及第二待执行语句,通过所述主事务并行执行所述第二待执行语句,对所述待更新数据进行写入。
本发明实施例提供的一种分布式数据库,解决了分布式数据库中的单机数据库对于一些语句只能串行执行导致的内存资源不足和性能较差的问题,本申请提供一种新的事务模型,即辅助事务模型,通过辅助事务模型中的主事务和辅助事务并行执行语句,通过辅助事务执行第一待执行语句流式读取数据行并反馈给分布式数据库入口,分布式数据库入口对数据进行处理后生成待更新数据并反馈给单机数据库,单机数据库依次接收到待更新数据和第二待执行语句,在每次接收到待更新数据和第二待执行语句后,通过主事务执行第二待执行语句实现待更新数据的写入,此时第一待执行数据可以流式读取数据行,实现了第二待执行语句和第一待执行语句的并行执行,即并行执行数据的读取和写入,节省分布式数据库入口的内存资源,减少执行时间,提高数据库性能。
本发明实施例所提供的分布式数据库系统,其包括的分布式数据库入口和单机数据库可执行本发明任意实施例所提供的分布式数据库的事务执行方法,具备执行方法相应的功能模块和有益效果。
实施例四
图7示出了可以用来实施本发明的实施例的电子设备60的结构示意图。电子设备旨在表示各种形式的数字计算机,诸如,膝上型计算机、台式计算机、工作台、个人数字助理、服务器、刀片式服务器、大型计算机、和其它适合的计算机。电子设备还可以表示各种形式的移动装置,诸如,个人数字助理、蜂窝电话、智能电话、可穿戴设备(如头盔、眼镜、手表等)和其它类似的计算装置。本文所示的部件、它们的连接和关系、以及它们的功能仅仅作为示例,并且不意在限制本文中描述的和/或者要求的本发明的实现。
如图7所示,电子设备60包括至少一个处理器61,以及与至少一个处理器61通信连接的存储器,如只读存储器(ROM)62、随机访问存储器(RAM)63等,其中,存储器存储有可被至少一个处理器执行的计算机程序,处理器61可以根据存储在只读存储器(ROM)62中的计算机程序或者从存储单元68加载到随机访问存储器(RAM)63中的计算机程序,来执行各种适当的动作和处理。在RAM 63中,还可存储电子设备60操作所需的各种程序和数据。处理器61、ROM 62以及RAM 63通过总线64彼此相连。输入/输出(I/O)接口65也连接至总线64。
电子设备60中的多个部件连接至I/O接口65,包括:输入单元66,例如键盘、鼠标等;输出单元67,例如各种类型的显示器、扬声器等;存储单元68,例如磁盘、光盘等;以及通信单元69,例如网卡、调制解调器、无线通信收发机等。通信单元69允许电子设备60通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据。
处理器61可以是各种具有处理和计算能力的通用和/或专用处理组件。处理器61的一些示例包括但不限于中央处理单元(CPU)、图形处理单元(GPU)、各种专用的人工智能(AI)计算芯片、各种运行机器学习模型算法的处理器、数字信号处理器(DSP)、以及任何适当的处理器、控制器、微控制器等。处理器61执行上文所描述的各个方法和处理,例如分布式数据库的事务执行方法。
在一些实施例中,分布式数据库的事务执行方法可被实现为计算机程序,其被有形地包含于计算机可读存储介质,例如存储单元68。在一些实施例中,计算机程序的部分或者全部可以经由ROM 62和/或通信单元69而被载入和/或安装到电子设备60上。当计算机程序加载到RAM 63并由处理器61执行时,可以执行上文描述的分布式数据库的事务执行方法的一个或多个步骤。备选地,在其他实施例中,处理器61可以通过其他任何适当的方式(例如,借助于固件)而被配置为执行分布式数据库的事务执行方法。
本文中以上描述的系统和技术的各种实施方式可以在数字电子电路系统、集成电路系统、场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、芯片上系统的系统(SOC)、负载可编程逻辑设备(CPLD)、计算机硬件、固件、软件、和/或它们的组合中实现。这些各种实施方式可以包括:实施在一个或者多个计算机程序中,该一个或者多个计算机程序可在包括至少一个可编程处理器的可编程系统上执行和/或解释,该可编程处理器可以是专用或者通用可编程处理器,可以从存储系统、至少一个输入装置、和至少一个输出装置接收数据和指令,并且将数据和指令传输至该存储系统、该至少一个输入装置、和该至少一个输出装置。
用于实施本发明的方法的计算机程序可以采用一个或多个编程语言的任何组合来编写。这些计算机程序可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器,使得计算机程序当由处理器执行时使流程图和/或框图中所规定的功能/操作被实施。计算机程序可以完全在机器上执行、部分地在机器上执行,作为独立软件包部分地在机器上执行且部分地在远程机器上执行或完全在远程机器或服务器上执行。
在本发明的上下文中,计算机可读存储介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的计算机程序。计算机可读存储介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。备选地,计算机可读存储介质可以是机器可读信号介质。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或快闪存储器)、光纤、便捷式紧凑盘只读存储器(CD-ROM)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
为了提供与用户的交互,可以在电子设备上实施此处描述的系统和技术,该电子设备具有:用于向用户显示信息的显示装置(例如,CRT(阴极射线管)或者LCD(液晶显示器)监视器);以及键盘和指向装置(例如,鼠标或者轨迹球),用户可以通过该键盘和该指向装置来将输入提供给电子设备。其它种类的装置还可以用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的传感反馈(例如,视觉反馈、听觉反馈、或者触觉反馈);并且可以用任何形式(包括声输入、语音输入或者、触觉输入)来接收来自用户的输入。
可以将此处描述的系统和技术实施在包括后台部件的计算系统(例如,作为数据服务器)、或者包括中间件部件的计算系统(例如,应用服务器)、或者包括前端部件的计算系统(例如,具有图形用户界面或者网络浏览器的用户计算机,用户可以通过该图形用户界面或者该网络浏览器来与此处描述的系统和技术的实施方式交互)、或者包括这种后台部件、中间件部件、或者前端部件的任何组合的计算系统中。可以通过任何形式或者介质的数字数据通信(例如,通信网络)来将系统的部件相互连接。通信网络的示例包括:局域网(LAN)、广域网(WAN)、区块链网络和互联网。
计算系统可以包括客户端和服务器。客户端和服务器一般远离彼此并且通常通过通信网络进行交互。通过在相应的计算机上运行并且彼此具有客户端-服务器关系的计算机程序来产生客户端和服务器的关系。服务器可以是云服务器,又称为云计算服务器或云主机,是云计算服务体系中的一项主机产品,以解决了传统物理主机与VPS服务中,存在的管理难度大,业务扩展性弱的缺陷。
应该理解,可以使用上面所示的各种形式的流程,重新排序、增加或删除步骤。例如,本发明中记载的各步骤可以并行地执行也可以顺序地执行也可以不同的次序执行,只要能够实现本发明的技术方案所期望的结果,本文在此不进行限制。
上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,根据设计要求和其他因素,可以进行各种修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。

Claims (18)

1.一种分布式数据库的事务执行方法,其特征在于,应用于分布式数据库中的单机数据库,包括:
通过辅助事务模型中的辅助事务接收分布式数据库入口根据操作语句确定并发送的第一待执行语句及执行序列号,所述辅助事务模型包括一一对应的主事务和辅助事务;
基于所述执行序列号以及预先确定的流式读取阈值,通过所述辅助事务流式执行所述第一待执行语句,批量读取数据行并返回至所述分布式数据库入口直到读取完所有数据行,其中,批量读取的数据行由所述分布式数据库入口进行数据处理,并生成待更新数据;
通过所述辅助事务模型中的主事务依次接收所述分布式数据库入口反馈的待更新数据及第二待执行语句,通过所述主事务并行执行所述第二待执行语句,对所述待更新数据进行写入。
2.根据权利要求1所述的方法,其特征在于,还包括:
如果所述单机数据库与所述分布式数据库入口不存在第一单机事务且满足辅助事务模型启动条件,启动辅助事务模型;
如果所述单机数据库与所述分布式数据库入口存在第一单机事务且满足辅助事务模型启动条件,基于所述第一单机事务启动辅助事务模型。
3.根据权利要求2所述的方法,其特征在于,启动辅助事务模型,包括:
通过第一会话接收事务启动命令和第一全局事务标识后,启动第一单机事务,并将所述第一单机事务的全局事务标识属性设置为所述第一全局事务标识,设置所述第一单机事务的主事务属性和辅助事务属性为空;
启动辅助事务,并将所述辅助事务作为所述第一单机事务的辅助事务,将所述第一单机事务作为主事务,根据所述主事务和所述辅助事务形成辅助事务模型。
4.根据权利要求2所述的方法,其特征在于,所述基于所述第一单机事务启动辅助事务模型,包括:
若所述第一单机事务的主事务属性和辅助事务属性均为空,启动辅助事务,并将所述辅助事务作为所述第一单机事务的辅助事务,将所述第一单机事务作为主事务,根据所述主事务和所述辅助事务形成辅助事务模型;
若所述第一单机事务的主事务属性为空且辅助事务属性不为空,确定所述第一单机事务为主事务,确定所述辅助事务属性对应的辅助事务,根据所述主事务和所述辅助事务形成辅助事务模型;
若所述第一单机事务的主事务属性不为空且辅助事务属性为空,确定所述第一单机事务为辅助事务,确定所述主事务属性对应的主事务,根据所述主事务和辅助事务形成辅助事务模型。
5.根据权利要求3或者4所述的方法,其特征在于,所述启动辅助事务,并将所述辅助事务作为所述第一单机事务的辅助事务,包括:
通过第二会话接收辅助事务启动命令和第二全局事务标识,启动辅助事务,设置所述辅助事务的主事务属性和辅助事务属性为空;
将所述第二全局事务标识与已启动的所有单机事务的全局事务标识属性进行匹配,若匹配成功的单机事务为所述第一单机事务,将所述辅助事务作为所述第一单机事务的辅助事务,设置所述辅助事务的主事务属性为所述第一单机事务的标识。
6.根据权利要求1所述的方法,其特征在于,所述基于所述执行序列号以及预先确定的流式读取阈值,通过所述辅助事务流式执行所述第一待执行语句,批量读取数据行并返回至所述分布式数据库入口,包括:
通过所述辅助事务解析所述第一待执行语句,确定至少一个待读取数据行;
针对每个待读取数据行,通过所述辅助事务申请所述待读取数据行的行锁,在行锁申请成功后,通过所述辅助事务结合所述执行序列号判断是否将所述待读取数据行加入到返回集合中;
当所述返回集合中的待读取数据行的个数等于所述流式读取阈值,通过所述辅助事务将所述返回集合中的所有待读取数据行反馈给所述分布式数据库入口。
7.根据权利要求6所述的方法,其特征在于,所述通过所述辅助事务申请所述待读取数据行的行锁,包括:
根据所述第一待执行语句确定行锁的第一目标类型;
判断所述辅助事务是否创建过所述待读取数据行对应的第一行锁实例且所述第一行锁实例的类型的级别不低于所述第一目标类型的级别,若是,将所述第一行锁实例作为所述待读取数据行的行锁;
否则,获取所述辅助事务的主事务属性,根据所述辅助事务的主事务属性申请所述待读取数据行的行锁。
8.根据权利要求7所述的方法,其特征在于,所述根据所述辅助事务的主事务属性申请所述待读取数据行的行锁,包括:
判断所述辅助事务的主事务属性是否不为空且所述主事务创建过所述待读取数据行对应的第二行锁实例且所述第二行锁实例的类型的级别不低于所述第一目标类型的级别;
若是,创建所述待读取数据行的第一目标行锁实例,并将所述第一目标行锁实例加入到所述辅助事务的行锁实例队列,将所述第一目标行锁实例加入到所述待读取数据行的全局行锁实例列表;
否则,遍历所述待读取数据行的全局行锁实例列表与全局行锁等待事务队列,如果存在其他事务创建过或者等待所述待读取数据行对应的第三行锁实例且所述第三行锁实例的类型与第一目标类型存在冲突,将所述辅助事务加入到等待所述待读取数据行的全局行锁等待队列,设置所述辅助事务的等待锁类型属性为第一目标类型,根据存在冲突的事务设置所述辅助事务的等待事务属性,控制所述辅助事务对应的会话进入睡眠;如果不存在其他事务创建过或者等待所述待读取数据行对应的第三行锁实例或者所述第三行锁实例的类型与第一目标类型存在冲突,创建所述待读取数据行的第一目标行锁实例,并将所述第一目标行锁实例加入到所述辅助事务的行锁实例队列,将所述第一目标行锁实例加入到所述待读取数据行的全局行锁实例列表。
9.根据权利要求6所述的方法,其特征在于,所述通过所述辅助事务结合所述执行序列号判断是否将所述待读取数据行加入到返回集合中,包括:
通过所述辅助事务获取所述待读取数据行的最后修改事务,若所述最后修改事务不为所述辅助事务的主事务,通过辅助事务将所述待读取数据行加入到返回集合中;
若所述最后修改事务为所述辅助事务的主事务,通过所述辅助事务获取所述待读取数据行的修改序列号,若所述修改序列号小于所述执行序列号,通过所述辅助事务将所述待读取数据行加入到返回集合中。
10.根据权利要求1所述的方法,其特征在于,所述通过所述主事务并行执行所述第二待执行语句,对所述待更新数据进行写入,包括:
通过所述主事务解析所述第二待执行语句,确定至少一个待写入数据行;
针对每个待写入数据行,通过所述主事务申请所述待写入数据行的行锁,基于所申请的行锁,通过所述主事务对所述待更新数据进行写入。
11.根据权利要求10所述的方法,其特征在于,所述通过所述主事务申请所述待写入数据行的行锁,包括:
根据所述第二待执行语句确定行锁的第二目标类型;
判断所述主事务是否创建过所述待写入数据行对应的第四行锁实例且所述第四行锁实例的类型的级别不低于所述第二目标类型的级别,若是,将所述第四行锁实例作为所述待写入数据行的行锁;
否则,获取所述主事务的辅助事务属性,根据所述主事务的辅助事务属性申请所述待写入数据行的行锁。
12.根据权利要求11所述的方法,其特征在于,所述根据所述主事务的辅助事务属性申请所述待写入数据行的行锁,包括:
判断所述主事务的辅助事务属性是否不为空且所述辅助事务创建过所述待写入数据行对应的第五行锁实例且所述第五行锁实例的类型的级别不低于所述第二目标类型的级别;
若是,创建所述待写入数据行的第二目标行锁实例,并将所述第二目标行锁实例加入到所述主事务的行锁实例队列,将所述第二目标行锁实例加入到所述待写入数据行的全局行锁实例列表;
否则,遍历所述待写入数据行的全局行锁实例列表与全局行锁等待事务队列,如果存在其他事务创建过或者等待所述待写入数据行对应的第六行锁实例且所述第六行锁实例的类型与第二目标类型存在冲突,将所述主事务加入到等待所述待写入数据行的全局行锁等待队列,设置所述主事务的等待锁类型属性为第二目标类型,根据存在冲突的事务设置所述主事务的等待事务属性,控制所述主事务对应的会话进入睡眠;如果不存在其他事务创建过或者等待所述待写入数据行对应的第六行锁实例或者所述第六行锁实例的类型与第二目标类型存在冲突,创建所述待写入数据行的第二目标行锁实例,并将所述第二目标行锁实例加入到所述主事务的行锁实例队列,将所述第二目标行锁实例加入到所述待写入数据行的全局行锁实例列表。
13.根据权利要求6-12任一项所述的方法,其特征在于,还包括:
当提交当前事务时,从所述当前事务申请的所有待处理数据行的行锁实例中选择一个待处理数据行作为待删除数据行,将所述待删除数据行的一个行锁实例作为待删除行锁实例;
遍历所述待删除数据行的全局行锁实例列表,将所述待删除行锁实例从所述待删除数据行的全局行锁实例列表中删除,将所述待删除行锁实例从所述当前事务的行锁实例队列中删除;
遍历所述待删除数据行的全局行锁等待队列,确定所述全局行锁等待队列中等待锁的事务并唤醒所述等待锁的事务所在的会话,直到所述当前事务申请的所有待处理数据行的所有行锁实例均被删除;
其中,所述等待锁的事务所等待的事务为当前事务;所述当前事务为所述主事务或者所述辅助事务,所述当前事务为所述主事务时,所述待处理数据行为待写入数据行,所述当前事务为所述辅助事务时,所述待处理数据行为待读取数据行。
14.根据权利要求13所述的方法,其特征在于,所述唤醒所述等待锁的事务所在的会话,包括:
根据所述等待锁的事务的等待锁类型属性获取所述等待锁的事务对应的等待锁类型;
判断是否所述等待锁的事务的主事务属性或辅助事务属性不为空且所述等待锁的事务的主事务或者辅助事务创建过所述待删除数据行的第七行锁实例且所述第七行锁实例的类型的级别不低于所述等待锁类型的级别;
若是,通过所述等待锁的事务创建第三目标行锁实例;否则,如果不存在其他事务创建过所述待删除数据行的第八行锁实例且所述第八行锁实例的类型与所述等待锁类型存在冲突,通过所述等待锁的事务创建第三目标行锁实例;
设置所述第三目标行锁实例的类型属性为等待锁类型,将所述第三目标行锁实例加入到所述等待锁的事务的行锁实例队列,将所述第三目标行锁实例加入到所述待删除数据行的全局行锁实例列表,将所述等待锁的事务从全局行锁等待列表中删除,唤醒所述等待锁的事务所在的会话。
15.根据权利要求14所述的方法,其特征在于,还包括:
如果所述等待锁的事务的主事务属性或者辅助事务属性不为空、所述等待锁的事务的主事务或者辅助事务在所述待删除数据行的行锁等待队列当中且等待的不是当前事务且等待的目标行锁类型的级别不高于所述等待锁类型,通过所述等待锁的事务的主事务或者辅助事务创建第四目标行锁实例;
设置所述第四目标行锁实例的类型属性为所述目标行锁类型,将所述第四目标行锁实例加入到所述等待锁的事务的主事务或者辅助事务的行锁实例队列,将所述第四目标行锁实例加入到所述待删除数据行的全局行锁实例列表,将所述等待锁的事务的主事务或者辅助事务从全局行锁等待列表中删除,唤醒所述等待锁的事务的主事务或者辅助事务所在的会话。
16.根据权利要求1所述的方法,其特征在于,还包括:
在对数据行进行写入后,将写入的数据行的修改序列号属性更新为所述执行序列号,将写入的数据行的最后修改事务属性更新为所述主事务。
17.一种电子设备,其特征在于,所述电子设备包括:
至少一个处理器,以及与所述至少一个处理器通信连接的存储器;
其中,所述存储器存储有可被所述至少一个处理器执行的计算机程序,所述计算机程序被所述至少一个处理器执行,以使所述至少一个处理器能够执行权利要求1-16中任一项所述的分布式数据库的事务执行方法。
18.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机指令,所述计算机指令用于使处理器执行时实现权利要求1-16中任一项所述的分布式数据库的事务执行方法。
CN202410304867.XA 2024-03-18 2024-03-18 一种分布式数据库的事务执行方法、电子设备及存储介质 Pending CN118113759A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202410304867.XA CN118113759A (zh) 2024-03-18 2024-03-18 一种分布式数据库的事务执行方法、电子设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202410304867.XA CN118113759A (zh) 2024-03-18 2024-03-18 一种分布式数据库的事务执行方法、电子设备及存储介质

Publications (1)

Publication Number Publication Date
CN118113759A true CN118113759A (zh) 2024-05-31

Family

ID=91215217

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202410304867.XA Pending CN118113759A (zh) 2024-03-18 2024-03-18 一种分布式数据库的事务执行方法、电子设备及存储介质

Country Status (1)

Country Link
CN (1) CN118113759A (zh)

Similar Documents

Publication Publication Date Title
EP3120261B1 (en) Dependency-aware transaction batching for data replication
CN111190935B (zh) 数据读取方法、装置、计算机设备及存储介质
CN110806933B (zh) 一种批量任务处理方法、装置、设备和存储介质
EP3955174A2 (en) Method, apparatus and storage medium for training a deep learning framework
CN105786595B (zh) 一种两段式提交的事务控制方法
WO2017128028A1 (zh) 一种事务处理方法及装置
CN114003644B (zh) 分布式事务处理方法、设备、介质和数据库系统
CN115617908A (zh) 一种MySQL数据同步方法、装置、数据库终端、介质及系统
CN112559496B (zh) 一种分布式数据库事务原子性实现方法及装置
CN106503027B (zh) 数据库操作方法及装置
CN118113759A (zh) 一种分布式数据库的事务执行方法、电子设备及存储介质
CN115421880A (zh) 事务处理方法、装置、设备及介质
CN114780022B (zh) 追加写操作实现方法、装置、电子设备及存储介质
CN115563114A (zh) 一种分布式唯一键约束方法、装置、设备和存储介质
CN115422231A (zh) 一种数据页处理方法、装置、电子设备及介质
CN115904817A (zh) 分布式数据库并行回放方法、装置、电子设备和存储介质
CN115525797A (zh) 数据库数据查询方法、装置、设备及存储介质
CN115080607A (zh) 一种结构化查询语句的优化方法、装置、设备及存储介质
CN112925807A (zh) 面向数据库的请求的批处理方法、装置、设备及存储介质
CN117331944A (zh) 一种数据库表生成方法、装置、设备及存储介质
CN109710690B (zh) 一种业务驱动计算方法及系统
CN116069797A (zh) 多版本数据库的时间戳生成方法、装置、设备及存储介质
CN115391052B (zh) 一种机器人任务处理方法、装置、电子设备和存储介质
CN118708653A (zh) 分布式数据库查询方法、分布式数据库、设备、介质及产品
CN116204508A (zh) 一种多版本并发控制方法、装置、设备及存储介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination