CN114328591A - 事务执行方法、装置、设备和存储介质 - Google Patents
事务执行方法、装置、设备和存储介质 Download PDFInfo
- Publication number
- CN114328591A CN114328591A CN202111677879.XA CN202111677879A CN114328591A CN 114328591 A CN114328591 A CN 114328591A CN 202111677879 A CN202111677879 A CN 202111677879A CN 114328591 A CN114328591 A CN 114328591A
- Authority
- CN
- China
- Prior art keywords
- transaction
- data
- version
- version number
- target
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/242—Query formulation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2458—Special types of queries, e.g. statistical queries, fuzzy queries or distributed queries
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Computational Linguistics (AREA)
- Mathematical Physics (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Probability & Statistics with Applications (AREA)
- Software Systems (AREA)
- Fuzzy Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请公开了一种事务执行方法、装置、设备和存储介质,属于区块链技术领域。应用于区块链系统,包括:接收携带有启动事务语句的第一交易后创建目标事务;每接收到一个第二交易,若该第二交易携带的SQL语句用于修改区块链账本中的第一数据,则在目标事务对第一数据加锁的情况下根据该SQL语句修改第一数据;若接收到携带有提交语句的第三交易,则对区块链账本中被目标事务加锁的所有数据进行解锁,以提交目标事务执行的多个SQL语句的修改数据。本申请中区块链系统实现了对事务的支持,即在区块链系统中可将客户端发送的多个SQL语句作为一个事务进行执行,提高了区块链系统执行SQL语句的灵活性和准确性,从而提高了业务适用性。
Description
技术领域
本申请涉及区块链技术领域,特别涉及一种事务执行方法、装置、设备和存储介质。
背景技术
目前,客户端可以向区块链系统发送携带有SQL(Structured Query Language,结构化查询语言)语句的交易。区块链系统接收到客户端发送的交易后,通过执行该交易,可以实现对该交易携带的SQL语句的执行,然后根据SQL语句的执行结果对区块链账本进行操作。
上述过程中,通过将SQL语句携带于交易中,来实现SQL语句在区块链系统中的执行。但是相比于传统的RDBMS(Relational Database Management System,关系数据库管理系统),区块链系统中的SQL语句的执行缺少了事务的特性。因为目前在区块链系统中一条交易实际上就是一个事务,即一条SQL语句实际上就是一个事务,而传统的RDBMS可以将多条SQL语句的执行变为一个事务进行提交或回滚,所以目前区块链系统没有实现传统的RDBMS中对于多条SQL语句形成的事务的支持,从而在业务使用上会比较受限。
发明内容
本申请提供了一种事务执行方法、装置、设备和存储介质,可以使区块链系统实现对事务的支持。所述技术方案如下:
第一方面,提供了一种事务执行方法,应用于区块链系统,所述方法包括:
接收到客户端发送的携带有启动事务语句的第一交易后,创建目标事务;
接收所述客户端发送的多个第二交易,所述多个第二交易中的每个第二交易均携带有需所述目标事务执行的用于操作区块链账本的SQL语句;
每接收到所述客户端发送的一个第二交易,若所述一个第二交易携带的SQL语句用于修改所述区块链账本中的第一数据,则在所述目标事务对所述第一数据加锁的情况下,根据所述一个第二交易携带的SQL语句修改所述第一数据;
若接收到所述客户端发送的携带有提交语句的第三交易,则对所述区块链账本中被所述目标事务加锁的所有数据进行解锁,以对所述目标事务执行的多个SQL语句的修改数据进行提交。
在本申请中,客户端向区块链系统发送携带有启动事务语句的第一交易指示区块链系统创建目标事务后,客户端可以不断向区块链系统发送携带有SQL语句的多个第二交易,以指示区块链系统将多个SQL语句作为一个事务进行执行。区块链系统创建目标事务后,每接收到客户端发送的一个第二交易,就可以对这个第二交易携带的SQL语句进行执行,具体地,若这个第二交易携带的SQL语句用于修改区块链账本中的第一数据,则在目标事务对第一数据加锁的情况下,根据这个第二交易携带的SQL语句修改第一数据。之后,客户端可以向区块链系统发送携带有提交语句的第三交易,区块链系统接收到第三交易后,可以对区块链账本中被目标事务加锁的所有数据进行解锁,以对目标事务执行的多个SQL语句的修改数据进行提交。如此,在区块链系统中实现了对事务的支持,即实现了在区块链系统将客户端发送的多个SQL语句作为一个事务进行执行,以此提高了区块链系统执行SQL语句的灵活性和准确性,从而提高了业务适用性。
可选地,所述方法还包括:
每接收到所述客户端发送的一个第二交易,对所述一个第二交易携带的SQL语句进行解析,得到解析结果,所述解析结果包括键值对和操作类型;
若所述操作类型为修改类型,则根据所述键值对中的key值在所述区块链账本中查找对应的数据作为所述一个第二交易携带的SQL语句需修改的所述第一数据。
可选地,所述区块链账本中的数据具有一条或多条版本记录,所述版本记录包括数据值、事务标识和版本号,所述事务标识为生成所述版本记录的事务的标识;
所述在所述目标事务对所述第一数据加锁的情况下,根据所述一个第二交易携带的SQL语句修改所述第一数据,包括:
若所述第一数据的版本号最大的版本记录中的版本号不是锁版本号,则在所述区块链账本中为所述第一数据新增一条版本号为所述锁版本号、事务标识为所述目标事务的标识的版本记录,以使所述目标事务对所述第一数据加锁,所述锁版本号是版本号所能取得的最大值;或者,若所述第一数据的版本号最大的版本记录中的版本号是所述锁版本号、且事务标识是所述目标事务的标识,则确定所述第一数据已被所述目标事务加锁;
根据所述一个第二交易携带的SQL语句对所述第一数据的版本记录中版本号为所述锁版本号的数据值进行修改。
可选地,所述对所述区块链账本中被所述目标事务加锁的所有数据进行解锁,包括:
为所述目标事务分配提交版本号;
将所述区块链账本中版本号为锁版本号、且事务标识为所述目标事务的标识的所有版本记录中的版本号均修改为所述目标事务的提交版本号,以对所述区块链账本中被所述目标事务加锁的所有数据进行解锁。
可选地,所述方法还包括:
每接收到所述客户端发送的一个第二交易,若所述一个第二交易携带的SQL语句用于读取所述区块链账本中的第二数据,则判断所述第二数据是否被所述目标事务加锁;
若所述第二数据已被所述目标事务加锁,则读取所述第二数据的版本记录中版本号为所述锁版本号的数据值;
若所述第二数据未被所述目标事务加锁,则在可重复读隔离级别下,读取所述第二数据的版本记录中版本号小于所述目标事务的开始版本号的数据值中版本号最大的数据值,所述目标事务的开始版本号是在创建所述目标事务时分配的;在读已提交隔离级别下,读取所述第二数据的版本记录中除版本号为所述锁版本号之外的数据值中版本号最大的数据值。
可选地,所述方法还包括:
若接收到所述客户端发送的携带有回滚语句的第四交易,则将所述区块链账本中版本号为所述锁版本号、且事务标识为所述目标事务的标识的所有版本记录进行删除,以对所述目标事务执行的多个SQL语句的修改数据进行回滚。
可选地,所述方法还包括:
在向区块链添加预设数量的区块后,清理所述区块链账本中的历史版本记录;或者,
在每次事务提交时,清理所述区块链账本中的历史版本记录;或者,
在每次事务读取所述区块链账本中的数据时,清理所述区块链账本中的历史版本记录。
可选地,所述清理所述区块链账本中的历史版本记录,包括:
将当前存活的事务的开始版本号中最小的开始版本号作为目标版本号,所述事务的开始版本号是在所述事务创建时分配的;
对于所述区块链账本中的每一个数据,将所述一个数据的版本记录中版本号小于所述目标版本号的版本记录作为所述一个数据的目标版本记录;
删除所述一个数据的目标版本记录中除版本号最大的版本记录之外的其他历史版本记录。
第二方面,提供了一种事务执行装置,应用于区块链系统,所述装置包括:
创建模块,用于接收到客户端发送的携带有启动事务语句的第一交易后,创建目标事务;
接收模块,用于接收所述客户端发送的多个第二交易,所述多个第二交易中的每个第二交易均携带有需所述目标事务执行的用于操作区块链账本的SQL语句;
修改模块,用于每接收到所述客户端发送的一个第二交易,若所述一个第二交易携带的SQL语句用于修改所述区块链账本中的第一数据,则在所述目标事务对所述第一数据加锁的情况下,根据所述一个第二交易携带的SQL语句修改所述第一数据;
提交模块,用于若接收到所述客户端发送的携带有提交语句的第三交易,则对所述区块链账本中被所述目标事务加锁的所有数据进行解锁,以对所述目标事务执行的多个SQL语句的修改数据进行提交。
可选地,所述装置还包括:
解析模块,用于每接收到所述客户端发送的一个第二交易,对所述一个第二交易携带的SQL语句进行解析,得到解析结果,所述解析结果包括键值对和操作类型;
查找模块,用于若所述操作类型为修改类型,则根据所述键值对中的key值在所述区块链账本中查找对应的数据作为所述一个第二交易携带的SQL语句需修改的所述第一数据。
可选地,所述区块链账本中的数据具有一条或多条版本记录,所述版本记录包括数据值、事务标识和版本号,所述事务标识为生成所述版本记录的事务的标识;所述修改模块用于:
若所述第一数据的版本号最大的版本记录中的版本号不是锁版本号,则在所述区块链账本中为所述第一数据新增一条版本号为所述锁版本号、事务标识为所述目标事务的标识的版本记录,以使所述目标事务对所述第一数据加锁,所述锁版本号是版本号所能取得的最大值;或者,若所述第一数据的版本号最大的版本记录中的版本号是所述锁版本号、且事务标识是所述目标事务的标识,则确定所述第一数据已被所述目标事务加锁;
根据所述一个第二交易携带的SQL语句对所述第一数据的版本记录中版本号为所述锁版本号的数据值进行修改。
可选地,所述提交模块用于:
为所述目标事务分配提交版本号;
将所述区块链账本中版本号为锁版本号、且事务标识为所述目标事务的标识的所有版本记录中的版本号均修改为所述目标事务的提交版本号,以对所述区块链账本中被所述目标事务加锁的所有数据进行解锁。
可选地,所述装置还包括:
判断模块,用于每接收到所述客户端发送的一个第二交易,若所述一个第二交易携带的SQL语句用于读取所述区块链账本中的第二数据,则判断所述第二数据是否被所述目标事务加锁;
第一读取模块,用于若所述第二数据已被所述目标事务加锁,则读取所述第二数据的版本记录中版本号为所述锁版本号的数据值;
第二读取模块,用于若所述第二数据未被所述目标事务加锁,则在可重复读隔离级别下,读取所述第二数据的版本记录中版本号小于所述目标事务的开始版本号的数据值中版本号最大的数据值,所述目标事务的开始版本号是在创建所述目标事务时分配的;在读已提交隔离级别下,读取所述第二数据的版本记录中除版本号为所述锁版本号之外的数据值中版本号最大的数据值。
可选地,所述装置还包括:
回滚模块,用于若接收到所述客户端发送的携带有回滚语句的第四交易,则将所述区块链账本中版本号为所述锁版本号、且事务标识为所述目标事务的标识的所有版本记录进行删除,以对所述目标事务执行的多个SQL语句的修改数据进行回滚。
可选地,所述装置还包括:
清理模块,用于在向区块链添加预设数量的区块后,清理所述区块链账本中的历史版本记录;或者,在每次事务提交时,清理所述区块链账本中的历史版本记录;或者,在每次事务读取所述区块链账本中的数据时,清理所述区块链账本中的历史版本记录。
可选地,所述清理模块用于:
将当前存活的事务的开始版本号中最小的开始版本号作为目标版本号,所述事务的开始版本号是在所述事务创建时分配的;
对于所述区块链账本中的每一个数据,将所述一个数据的版本记录中版本号小于所述目标版本号的版本记录作为所述一个数据的目标版本记录;
删除所述一个数据的目标版本记录中除版本号最大的版本记录之外的其他历史版本记录。
第三方面,提供了一种计算机设备,所述计算机设备包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现上述的事务执行方法。
第四方面,提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现上述的事务执行方法。
第五方面,提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述的事务执行方法的步骤。
可以理解的是,上述第二方面、第三方面、第四方面、第五方面的有益效果可以参见上述第一方面中的相关描述,在此不再赘述。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请实施例提供的一种区块链系统的结构示意图;
图2是本申请实施例提供的一种区块链的示意图;
图3是本申请实施例提供的一种事务执行系统的示意图;
图4是本申请实施例提供的一种事务执行方法的流程图;
图5是本申请实施例提供的一种非持续性事务的执行过程的示意图;
图6是本申请实施例提供的一种持续性事务的执行过程的示意图;
图7是本申请实施例提供的一种事务执行装置的结构示意图;
图8是本申请实施例提供的一种计算机设备的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
应当理解的是,本申请提及的“多个”是指两个或两个以上。在本申请的描述中,除非另有说明,“/”表示或的意思,比如,A/B可以表示A或B;本文中的“和/或”仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,比如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,为了便于清楚描述本申请的技术方案,采用了“第一”、“第二”等字样对功能和作用基本相同的相同项或相似项进行区分。本领域技术人员可以理解“第一”、“第二”等字样并不对数量和执行次序进行限定,并且“第一”、“第二”等字样也并不限定一定不同。
在对本申请实施例进行解释说明之前,先对区块链的相关内容予以说明。
图1是本申请实施例提供的一种区块链系统的结构示意图。
参见图1,区块链系统100是指用于进行节点与节点之间数据共享的系统,区块链系统100中可以包括多个节点101。每个节点101在进行正常工作时可以接收到输入信息,并基于接收到的输入信息维护区块链系统100内的共享数据。为了保证区块链系统100内的信息互通,区块链系统100中的每个节点101之间可以存在信息连接,节点101之间可以通过该信息连接进行信息传输。比如,当区块链系统100中的任意节点101接收到输入信息时,区块链系统100中的其他节点101便根据共识算法获取该输入信息,将该输入信息作为共享数据中的数据进行存储,使得区块链系统100中全部节点101上存储的数据一致。
区块链系统100中的每个节点101均存储一条相同的区块链。下面以图2为例来对区块链的一种可能的结构进行说明,当然,实际应用中,根据不同的场景,区块链的结构也可以有所不同,本申请实施例对此不作限定。
参见图2,区块链由多个区块组成,创始块中包括区块头和区块主体。作为一种示例,区块头中存储有输入信息特征值、版本号、时间戳和难度值,区块主体中存储有输入信息;创始块的下一区块以创始块为父区块,下一区块中同样包括区块头和区块主体,区块头中存储有当前区块的输入信息特征值、父区块的区块头特征值、版本号、时间戳和难度值,并以此类推,使得区块链中每个区块中存储的区块数据均与父区块中存储的区块数据存在关联,保证了区块中输入信息的安全性。
区块链系统100具有分布式数据存储、点对点传输、共识机制、加密算法等计算机技术。区块链系统100是一个分布式的共享账本和数据库,具有去中心化、不可篡改、全程留痕、可以追溯、集体维护、公开透明等特点。这些特点保证了区块链的共享开放、真实完整和安全可靠。
在对本申请实施例进行详细地解释说明之前,对本申请实施例涉及的事务的有关概念进行说明。
事务是构成单一逻辑工作单元的操作集合。事务可以包含一个或多个操作,这些操作构成一个逻辑上的整体。构成逻辑整体的这些操作,要么全部执行成功,要么全部不执行。也即,构成事务的所有操作,要么全都对数据库产生影响,要么全都不产生影响,从而不管事务是否执行成功,数据库总能保持一致性状态。
事务具有ACID特征,分别为:原子性(Atomicity):事务中的所有操作作为一个整体像原子一样不可分割,要么全部成功,要么全部失败。一致性(Consistency):事务的执行结果必须使数据库从一个一致性状态到另一个一致性状态。隔离性(Isolation):并发执行的事务不会相互影响,其对数据库的影响和它们串行执行时一样。持久性(Durability):事务一旦提交,其对数据库的更新就是持久的。
事务之间具有隔离性,理论上来说事务之间的执行不应该相互产生影响,其对数据库的影响应该和它们串行执行时一样。然而完全隔离会导致系统并发性能很低,降低对资源的利用率,因而实际应用时对隔离性的要求会有所放宽,这也会在一定程度上造成对数据库的一致性要求的降低。SQL标准为事务定义了不同的隔离级别,从低到高依次是:读未提交(READ UNCOMMITTED):能够读取到没有提交的数据,即如果一个事务已经开始写数据,则另一个事务不允许同时进行写操作,但允许其他事务读取此数据。读已提交(READCOMMITTED):能够读取到已经提交的数据,即如果一个事务是读取数据,则允许其他事务访问此数据(包括读写操作);如果一个事务是写数据,禁止其他事务访问此数据。可重复读(REPEATABLE READ):在一个事务内,多次读同一个数据,在这个事务还没结束时,其他事务不能访问此数据。串行化(SERIALIZABLE):提供严格的事务隔离,要求事务序列化执行,即事务只能一个接着一个地执行,不能并发执行。
下面对本申请实施例涉及的系统架构予以说明。
图3是本申请实施例提供的一种事务执行系统的示意图。参见图3,该事务执行系统包括:客户端301和区块链系统302。
客户端301可以安装于终端,也可以安装于服务器。客户端301对应的服务端安装于区块链系统302。区块链系统302可以是上文图1-图2实施例所示的区块链系统100。客户端301与区块链系统302可以通过有线连接与无线连接进行通信。
客户端301用于生成SQL语句,并将该SQL语句携带于交易中发送给区块链系统302,该SQL语句用于实现对区块链账本的操作,即用于对区块链账本中的数据进行读取或修改(包括插入、更新、删除)。区块链系统302接收到客户端301发送的交易后,可以通过执行该交易,来执行该交易携带的SQL语句,以此实现对区块链账本的操作。也即,在本申请实施例中,客户端301可以直接通过SQL语句来操作区块链系统302中的区块链账本。
其中,客户端301和区块链系统302可以通过下文图4实施例提供的事务执行方法,来实现区块链系统302将客户端301发送的多个SQL语句作为一个事务进行执行,以此提高区块链系统302执行SQL语句的灵活性和准确性,从而提高业务适用性。
下面对本申请实施例提供的事务执行方法进行详细地解释说明。
图4是本申请实施例提供的一种事务执行方法的流程图。参见图4,该方法包括以下步骤。
步骤401:客户端向区块链系统发送携带有启动事务语句的第一交易。
第一交易的交易体内可以包含启动事务语句。启动事务语句(start transaction语句)用于指示区块链系统启动事务,以将客户端后续发送的多个SQL语句作为一个事务进行执行,即对该多个SQL语句的执行结果同时进行提交或回滚。
步骤402:区块链系统接收到客户端发送的第一交易后,创建目标事务。
区块链系统创建目标事务后,即可将客户端后续发送的多个SQL语句作为需目标事务执行的SQL语句。目标事务中的多个SQL语句的执行结果可以同时进行提交或回滚。也即,目标事务提交,是指同时提交目标事务中多个SQL语句的执行结果;目标事务回滚,是指同时回滚目标事务中多个SQL语句的执行结果。
区块链系统创建目标事务的操作与相关技术中某个设备创建某个事务的操作类似,本申请实施例对此不进行详细阐述。
区块链系统创建目标事务后,可以为目标事务设置标识,且可以为目标事务分配开始版本号。可选地,目标事务的标识可以与目标事务的开始版本号相同。
某个事务的标识用于唯一标识这个事务。可选地,在区块链系统中,各个事务的标识可以是递增的,即先创建的事务的标识可以小于后创建的事务的标识。
某个事务的开始版本号可以为创建这个事务时的逻辑时间。示例地,区块链系统可以具有逻辑时钟,区块链系统可以使用全局保存的单调递增的逻辑时钟来确定创建各个事务时的逻辑时间,将创建各个事务时的逻辑时间作为各个事务的开始版本号。该逻辑时间可以为uint64(无符号64位整数)。
步骤403:客户端向区块链系统发送多个第二交易。
客户端向区块链系统发送的多个第二交易是用于对区块链系统中的区块链账本进行操作的交易。该多个第二交易中的每个第二交易均携带SQL语句。该多个第二交易中的每个第二交易携带的SQL语句均是区块链系统新创建的目标事务需执行的SQL语句。
第二交易中携带的SQL语句用于对区块链账本进行操作。比如,该SQL语句可以是DML(Data Manipulation Language,数据操纵语言)语句,具体来讲,该SQL语句可以用于对区块链账本中的数据进行读取(SELECT)或修改(包括插入(INSERT)、更新(UPDATE)、删除(DELETE))。
客户端向区块链系统发送多个第二交易后,区块链系统可以接收该多个第二交易,且区块链系统每接收到一个第二交易,就可以执行如下步骤404-步骤406。
步骤404:区块链系统每接收到客户端发送的一个第二交易,判断这个第二交易是要修改还是要读取区块链账本中的数据。
具体地,区块链系统每接收到客户端发送的一个第二交易,可以对这个第二交易携带的SQL语句进行解析,得到解析结果;若该解析结果中的操作类型为修改类型,则确定这个第二交易是要修改区块链账本中的数据,可以根据该解析结果中的键值对中的key值在区块链账本中查找对应的数据作为这个第二交易携带的SQL语句需修改的第一数据;若该解析结果中的操作类型为读取类型,则确定这个第二交易是要读取区块链账本中的数据,可以根据该解析结果中的键值对中的key值在区块链账本中查找对应的数据作为这个第二交易携带的SQL语句需读取的第二数据。
该解析结果包括键值对和操作类型。该键值对包括key值和value值。key值为所要操作的数据的关键字(如主键),根据key值可以从区块链账本中查找所要操作的数据。value值为所要操作的数据的具体值。该操作类型用于指示对数据要进行的操作,可以包括读取类型和修改类型(包括插入类型、更新类型、删除类型)。
区块链系统对这个第二交易携带的SQL语句进行解析,即是将SQL语句对于结构化数据的表述转换为对kv类型数据的表述,如此就可以得到包含有键值对和操作类型的解析结果。kv类型数据是区块链账本所能存储的数据格式。区块链系统对这个第二交易携带的SQL语句进行解析的操作可以调用SQL智能合约实现。
区块链系统对这个第二交易携带的SQL语句进行解析的操作可以参考相关技术中某个设备对SQL语句进行解析的操作,本申请实施例对此不进行详细阐述。
下面对区块链账本中的数据结构进行说明。
区块链账本中的数据可以具有一条或多条版本记录。对于区块链账本中的任意一个数据的任意一条版本记录来说,这条版本记录包括数据值、事务标识和版本号,该数据值为这个数据的真实值(如可以为rowValue),该事务标识为生成这条版本记录的事务的标识,该版本号用于指示这条版本记录的版本。可选地,该版本号可以借助于MVCC(Multiversion Concurrency Control,多版本并发控制)机制实现。
对于区块链账本中的任意一个数据来说,若这个数据仅具有一条版本记录,则这条版本记录是这个数据的最新版本。若这个数据具有多条版本记录,则版本号最大的版本记录是这个数据的最新版本,其他版本记录是这个数据的历史版本。
比如,区块链账本中的数据可以为kv类型数据。区块链账本中的一个数据可以如下表1所示,表1中的第二行至第三行中的每一行为这个数据的一条版本记录,即这个数据具有三条版本记录。
表1
key值 | value值 |
key3 | 数据值3、事务标识3、版本号3 |
key2 | 数据值2、事务标识2、版本号2 |
key1 | 数据值1、事务标识1、版本号1 |
本申请实施例仅以上表1为例来对区块链账本中的数据的版本记录进行举例说明,上表1并不对本申请实施例构成限定。
值得注意的是,在本申请实施例中,引入锁版本号。锁版本号是版本号所能取得的最大值。比如,在版本号为uint64的情况下,锁版本号可以为uint64中的最大值。对于区块链账本中的任意一个数据,若这个数据的版本号最大的版本记录中的版本号是锁版本号,则说明这个数据已被加锁,且是被该版本号最大的版本记录中的事务标识所标识的事务加锁的。这个数据被该事务加锁后,只有该事务可以对这个数据进行修改,其他事务不能对这个数据进行修改。也即,本申请实施例采用悲观锁机制。
此外,对于区块链账本中的任意一个数据来说,这个数据的版本记录中的value值为结构化数据,且包括数据值、事务标识和版本号。可选地,对于这个数据的版本记录中版本号为锁版本号的版本记录,该版本记录中的value值还可以包括指定数据类型(即锁)等。对于这个数据的版本记录中除版本号为锁版本号的版本记录之外的其他版本记录,其他版本记录中的value值还可以包括事务标识所标识的事务的提交版本号、事务提交时的数据类型(即写入(插入或更新)、或删除)等。
某个事务的提交版本号可以为提交这个事务时的逻辑时间。示例地,区块链系统可以具有逻辑时钟,区块链系统可以使用全局保存的单调递增的逻辑时钟来确定提交各个事务时的逻辑时间,将提交各个事务时的逻辑时间作为各个事务的提交版本号。该逻辑时间可以为uint64。
需说明的是,在某个事务删除区块链账本中的某个数据的情况下,这个事务提交时,这个数据可以先不从区块链账本中删除,而是先将其数据类型标记为删除。如此,若存在其他事务要读取这个数据,则在发现这个数据的数据类型为删除的情况下,确定这个数据已被删除,返回空值。
若这个第二交易是要修改区块链账本中的数据,则区块链系统继续执行如下步骤405。若这个第二交易是要读取区块链账本中的数据,则区块链系统继续执行如下步骤406。
步骤405:若这个第二交易携带的SQL语句用于修改区块链账本中的第一数据,则区块链系统在目标事务对第一数据加锁的情况下,根据这个第二交易携带的SQL语句修改第一数据。
若这个第二交易携带的SQL语句需修改区块链账本中的第一数据,则需要先确定第一数据是否被除目标事务之外的其他事务加锁。若第一数据已被其他事务加锁,则会出现锁冲突,此时这个第二交易无法修改第一数据,这个第二交易执行失败,目标事务回滚;若第一数据未被其他事务加锁,则这个第二交易可以修改第一数据,这个第二交易可以正常执行,此时目标事务继续正常执行。
这种情况下,若第一数据的版本号最大的版本记录中的版本号不是锁版本号,说明第一数据未被任何事务加锁,此时由于这个第二交易需要修改第一数据,所以目标事务需要对第一数据加锁。具体地,若第一数据未被任何事务加锁,则在区块链账本中为第一数据新增一条版本号为锁版本号、事务标识为目标事务的标识的版本记录,以使目标事务对第一数据加锁。可选地,可以向区块链账本中写入目标键值对,来实现目标事务对第一数据的加锁。其中,目标键值对中的key值包括这个第二交易携带的SQL语句的解析结果中的键值对中的key值(如可以为rowKey)和锁版本号,目标键值对中的value值为第一数据的当前最新版本的版本记录中的数据值。
或者,若第一数据的版本号最大的版本记录中的版本号是锁版本号、且事务标识是目标事务的标识,则确定第一数据已被目标事务加锁。这种情况下,是在执行这个第二交易之前,在执行首个需修改第一数据的第二交易时,在区块链账本中为第一数据新增了一条版本号为锁版本号、事务标识为目标事务的标识的版本记录,以实现目标事务对第一数据的加锁。
比如,假设第一数据的多条版本记录如表1所示,若第一数据未被任何事务加锁,则在表1中新增一条版本记录,得到下表2。如表2所示,新增的这条版本记录中的数据值与前一版本的版本记录中的数据值相同,新增的这条版本记录中的版本号为锁版本号,新增的这条版本记录中的事务标识为目标事务的标识。如此,就实现了目标事务对第一数据的加锁。
表2
key值 | value值 |
key4 | 数据值3、目标事务的标识、锁版本号 |
key3 | 数据值3、事务标识3、版本号3 |
key2 | 数据值2、事务标识2、版本号2 |
key1 | 数据值1、事务标识1、版本号1 |
本申请实施例仅以上表2为例来对第一数据的版本记录进行举例说明,上表2并不对本申请实施例构成限定。
在第一数据被目标事务加锁的情况下,区块链系统可以根据这个第二交易携带的SQL语句对第一数据的版本记录中版本号为锁版本号的数据值进行修改,具体可以根据这个第二交易携带的SQL语句的解析结果中的操作类型和键值对中的value值,对第一数据的版本记录中版本号为锁版本号的数据值进行修改,此时实际上就是对第一数据中由目标事务加锁的版本记录中的数据值进行修改。
值得注意的一点是,在本申请实施例中,若存在第二交易要对第一数据进行修改,则对于第一数据,会新增一个版本号为锁版本号、事务标识为目标事务的标识的版本记录以供目标事务进行修改。第一数据中除此新增的由目标事务加锁的版本记录之外的其他版本记录是已提交的历史事务生成的。如此,在目标事务提交之前,目标事务对第一数据的修改不会影响到此前针对第一数据已提交的数据值。
值得注意的另一点是,目标事务对区块链账本中的数据进行修改后,由于后续涉及到对目标事务的提交或回滚,所以需要知道目标事务在区块链账本中修改的数据的key值,如此才能进行修改数据的提交或回滚。因而需要将目标事务修改的数据的key值记录下来,这种情况下,可以将目标事务的标识与目标事务修改的数据的key值对应存储,如可以以目标事务的标识为前缀来存储目标事务修改的数据的key值,且可以存储至内存中,方便迭代,后续可以据此进行目标事务的提交或回滚。
步骤406:若这个第二交易携带的SQL语句用于读取区块链账本中的第二数据,则区块链系统根据这个第二交易携带的SQL语句读取第二数据。
区块链系统可以根据这个第二交易携带的SQL语句的解析结果中的操作类型和键值对中的value值,读取第二数据的版本记录中的数据值,具体读取过程可以包括如下步骤(1)-步骤(3):
(1)区块链系统先判断第二数据是否被目标事务加锁。
具体地,若第二数据的版本号最大的版本记录中的版本号是锁版本号、且事务标识是目标事务的标识,则区块链系统确定第二数据已被目标事务加锁;否则,区块链系统确定第二数据未被目标事务加锁。
(2)若第二数据已被目标事务加锁,则区块链系统读取第二数据的版本记录中版本号为锁版本号的数据值。
若第二数据已被目标事务加锁,则第二数据的版本记录中版本号为锁版本号的数据值是经目标事务修改后的数据值,因而此时可以直接读取该数据值。
(3)若第二数据未被目标事务加锁,则在可重复读隔离级别下,区块链系统读取第二数据的版本记录中版本号小于目标事务的开始版本号的数据值中版本号最大的数据值;在读已提交隔离级别下,区块链系统读取第二数据的版本记录中除版本号为锁版本号之外的数据值中版本号最大的数据值。
在可重复读隔离级别下,可以读取的是在创建目标事务之前最晚提交的事务生成的版本记录中的数据值,也即可以读取第二数据的版本记录中版本号小于目标事务的开始版本号的数据值中版本号最大的数据值。
在读已提交隔离级别下,可以读取的是当前最新提交的事务生成的版本记录中的数据值,也即可以读取第二数据的版本记录中除版本号为锁版本号之外的数据值中版本号最大的数据值。
进一步地,区块链系统读取到第二数据后,还可以将读取到的第二数据返回给客户端。
值得注意的是,客户端向区块链系统发送多个第二交易,区块链系统每接收到一个第二交易,就可以按照上述步骤404-步骤406来执行这个第二交易,也即执行这个第二交易携带的SQL语句来操作区块链账本,直至区块链系统接收到客户端发送的最后一个第二交易并执行为止。
客户端向区块链系统发送多个第二交易后,可以指示区块链系统对目标事务进行提交或回滚。若客户端想指示对目标事务进行提交,则可以继续进行如下步骤407-步骤408。若客户端想指示对目标事务进行回滚,则可以执行如下步骤409-步骤410。
步骤407:客户端向区块链系统发送携带有提交语句的第三交易。
提交语句(commit语句)用于指示对目标事务进行提交。客户端向区块链系统发送启动事务语句指示区块链系统创建目标事务后,向区块链系统发送多个SQL语句,此时区块链系统将该多个SQL语句作为所创建的目标事务中的SQL语句,对该多个SQL语句进行执行。之后,客户端可以向区块链系统发送提交语句,以指示区块链系统对所创建的目标事务进行提交,也即对目标事务中的多个SQL语句的执行结果进行提交。
步骤408:区块链系统接收到客户端发送的第三交易后,对区块链账本中被目标事务加锁的所有数据进行解锁,以对目标事务执行的多个SQL语句的修改数据进行提交。
区块链系统接收到客户端发送的第三交易后,确定需要对目标事务进行提交,则可以为目标事务分配提交版本号,然后将区块链账本中版本号为锁版本号、且事务标识为目标事务的标识的所有版本记录中的版本号均修改为目标事务的提交版本号,以对区块链账本中被目标事务加锁的所有数据进行解锁。
区块链账本中版本号为锁版本号、且事务标识为目标事务的标识的版本记录,是被目标事务加锁的版本记录,也即是目标事务在执行时新增的进行了数据值修改的版本记录,因而在提交目标事务时,只需要将该版本记录中的版本号修改为目标事务的提交版本号,就可以实现解锁,此时该版本记录更新至区块链账本中,对其他事务可见,从而实现了对目标事务执行的多个SQL语句的修改数据的提交。
一种可能的方式中,由于之前在目标事务执行的时候,存储了目标事务的标识与目标事务在区块链系统中修改的数据的key值,所以区块链系统接收到客户端发送的第三交易后,可以先根据目标事务的标识获取所修改的数据的key值,然后再将区块链账本中与该key值对应的数据的版本号为锁版本号、且事务标识为目标事务的标识的版本记录中的版本号修改为目标事务的提交版本号,以对目标事务的修改数据进行提交,如此可以提高目标事务的提交效率。
步骤409:客户端向区块链系统发送携带有回滚语句的第四交易。
回滚语句(rollback语句)用于指示对目标事务进行回滚。客户端向区块链系统发送启动事务语句指示区块链系统创建目标事务后,向区块链系统发送多个SQL语句,此时区块链系统将该多个SQL语句作为所创建的目标事务中的SQL语句,对该多个SQL语句进行执行。之后,客户端可以向区块链系统发送回滚语句,以指示区块链系统对所创建的目标事务进行回滚,也即对目标事务中的多个SQL语句的执行结果进行回滚。
步骤410:区块链系统接收到客户端发送的第四交易后,对目标事务执行的多个SQL语句的修改数据进行回滚。
区块链系统接收到客户端发送的第四交易后,确定需要对目标事务进行回滚,则将区块链账本中版本号为锁版本号、且事务标识为目标事务的标识的所有版本记录进行删除,以对目标事务执行的多个SQL语句的修改数据进行回滚。
区块链账本中版本号为锁版本号、且事务标识为目标事务的标识的版本记录,是被目标事务加锁的版本记录,也即是目标事务在执行时新增的进行了数据值修改的版本记录,因而在回滚目标事务时,只需要将该版本记录删除,即可实现对目标事务执行的多个SQL语句的修改数据的回滚。
一种可能的方式中,由于之前在目标事务执行的时候,存储了目标事务的标识与目标事务在区块链系统中修改的数据的key值,所以区块链系统接收到客户端发送的第四交易后,可以先根据目标事务的标识获取所修改的数据的key值,然后再将区块链账本中与该key值对应的数据的版本号为锁版本号、且事务标识为目标事务的标识的版本记录进行删除,以对目标事务的修改数据进行回滚,如此可以提高目标事务的回滚效率。
在一些实施例中,区块链系统还可以定期进行GC(Garbage Collection,垃圾回收),即可以对区块链账本中的历史版本记录进行清理,以将冗余的无用版本记录删除,节省存储资源。
比如,区块链系统可以在向区块链添加预设数量的区块后,清理区块链账本中的历史版本记录;或者,在每次事务提交时,清理区块链账本中的历史版本记录;或者,在每次事务读取区块链账本中的数据时,清理区块链账本中的历史版本记录。
对于区块链账本中的任意一个数据来说,这个数据的历史版本记录可以是这个数据的版本记录中除了加锁的版本记录和最新提交的事务生成的版本记录之外的版本记录。这种情况下,区块链系统清理区块链账本中的历史版本记录的操作可以为:将当前存活的事务的开始版本号中最小的开始版本号作为目标版本号;对于区块链账本中的每一个数据,将这个数据的版本记录中版本号小于目标版本号的版本记录作为这个数据的目标版本记录;删除这个数据的目标版本记录中除版本号最大的版本记录之外的其他历史版本记录。
当前存活的事务即是正在执行、尚未提交的事务。区块链系统可以实时记录当前存活的事务的开始版本号,据此可以获知当前存活的事务的开始版本号中最小的开始版本号。
由于目标版本号是当前存活的事务的开始版本号中最小的开始版本号,所以版本号小于目标版本号的版本记录均是已提交的事务生成的版本记录。也即,这个数据的目标版本记录是已提交的事务生成的版本记录,因而可以保留这个数据的目标版本记录中版本号最大的版本记录,删除其他历史版本记录。
值得注意的是,本申请实施例中区块链系统执行的操作均可以由区块链系统中的SQL执行引擎来执行,当然,也可以由其他模块来执行,本申请实施例对此不作限定。
在一些实施例中,事务使用会有两种情况,通过启动事务语句来决定是否自动提交事务。若区块链系统未接收到启动事务语句,则自动提交事务,即执行非持续性事务,具体是每接收到一条SQL语句便会在执行后提交,此时实际上是将每次接收到的一条SQL语句作为一个事务进行执行。若区块链系统接收到启动事务语句,则不自动提交事务,即执行持续性事务,具体是将接收到的多条SQL语句作为一个事务进行执行,对多条SQL语句的执行结果同时提交或回滚。
为了便于理解,下面结合图5和图6来对非持续性事务和持续性事务的执行过程进行举例说明。
图5是本申请实施例提供的一种非持续性事务的执行过程的示意图。参见图5,非持续性事务的执行过程应用于区块链系统,可以包括如下步骤(1)-步骤(5)。
(1)接收到客户端发送的携带有SQL语句的交易后,将这条SQL语句作为一个事务。
(2)对该SQL语句进行解析,以确定该SQL语句是需要读取区块链账本中的数据还是需要修改区块链账本中的数据。
(3)若该SQL语句需要修改区块链账本中的数据,则判断所要修改的数据是否已经被其他事务加锁;若该数据已被其他事务加锁,则锁冲突,当前交易执行失败;若该数据未被其他事务加锁,则该事务对该数据加锁后,对该数据进行修改,修改完成后对该数据进行解锁,以提交该事务。
(4)若该SQL语句需要读取区块链账本中的数据,则读取所要读取的数据的未被其他事务加锁的版本记录中版本号小于或等于该事务的开始版本号的数据值中版本号最大的数据值,将读取到的数据返回给客户端,以实现对该事务的提交。
(5)提交该事务后,触发GC流程,以对区块链账本中的历史版本记录进行清理。
图6是本申请实施例提供的一种持续性事务的执行过程的示意图。参见图6,持续性事务的执行过程应用于区块链系统,可以包括如下步骤(1)-步骤(8)。
(1)接收到客户端发送的携带有启动事务语句的交易后,创建事务。
(2)接收客户端发送的多个携带有SQL语句的交易。
(3)每接收到客户端发送的一个携带有SQL语句的交易,对该SQL语句进行解析,以确定该SQL语句是需要读取区块链账本中的数据还是需要修改区块链账本中的数据。
(4)若该SQL语句需要修改区块链账本中的数据,则判断所要修改的数据是否已经被其他事务加锁;若该数据已被其他事务加锁,则锁冲突,当前交易执行失败,该事务也执行失败;若该数据未被其他事务加锁,则该事务对该数据加锁后,对该数据进行修改。
(5)若该SQL语句需要读取区块链账本中的数据,则读取所要读取的数据的未被其他事务加锁的版本记录中版本号小于或等于该事务的开始版本号的数据值中版本号最大的数据值,将读取到的数据返回给客户端。
(6)若接收到客户端发送的携带有提交语句的交易,则将区块链账本中版本号为锁版本号、且事务标识为该事务的标识的所有版本记录中的版本号均修改为该事务的提交版本号,以对该事务执行的多个SQL语句的修改数据进行提交。
(7)若接收到客户端发送的携带有回滚语句的交易,则将区块链账本中版本号为锁版本号、且事务标识为该事务的标识的所有版本记录进行删除,以对该事务执行的多个SQL语句的修改数据进行回滚。
(8)提交或回滚该事务后,触发GC流程,以对区块链账本中的历史版本记录进行清理。
在本申请实施例中,客户端向区块链系统发送携带有启动事务语句的第一交易指示区块链系统创建目标事务后,客户端可以不断向区块链系统发送携带有SQL语句的多个第二交易,以指示区块链系统将多个SQL语句作为一个事务进行执行。区块链系统创建目标事务后,每接收到客户端发送的一个第二交易,就可以对这个第二交易携带的SQL语句进行执行,具体地,若这个第二交易携带的SQL语句用于修改区块链账本中的第一数据,则在目标事务对第一数据加锁的情况下,根据这个第二交易携带的SQL语句修改第一数据。之后,客户端可以向区块链系统发送携带有提交语句的第三交易,区块链系统接收到第三交易后,可以对区块链账本中被目标事务加锁的所有数据进行解锁,以对目标事务执行的多个SQL语句的修改数据进行提交。如此,在区块链系统中实现了对事务的支持,即实现了在区块链系统将客户端发送的多个SQL语句作为一个事务进行执行,以此提高了区块链系统执行SQL语句的灵活性和准确性,从而提高了业务适用性。
图7是本申请实施例提供的一种事务执行装置的结构示意图。该装置可以由软件、硬件或者两者的结合实现成为计算机设备的部分或者全部,该计算机设备可以为下文图8所示的计算机设备,该计算机设备可以为区块链系统。参见图7,该装置包括:创建模块701、接收模块702、修改模块703、提交模块704。
创建模块701,用于接收到客户端发送的携带有启动事务语句的第一交易后,创建目标事务;
接收模块702,用于接收客户端发送的多个第二交易,多个第二交易中的每个第二交易均携带有需目标事务执行的用于操作区块链账本的SQL语句;
修改模块703,用于每接收到客户端发送的一个第二交易,若一个第二交易携带的SQL语句用于修改区块链账本中的第一数据,则在目标事务对第一数据加锁的情况下,根据一个第二交易携带的SQL语句修改第一数据;
提交模块704,用于若接收到客户端发送的携带有提交语句的第三交易,则对区块链账本中被目标事务加锁的所有数据进行解锁,以对目标事务执行的多个SQL语句的修改数据进行提交。
可选地,该装置还包括:
解析模块,用于每接收到客户端发送的一个第二交易,对一个第二交易携带的SQL语句进行解析,得到解析结果,解析结果包括键值对和操作类型;
查找模块,用于若操作类型为修改类型,则根据键值对中的key值在区块链账本中查找对应的数据作为一个第二交易携带的SQL语句需修改的第一数据。
可选地,区块链账本中的数据具有一条或多条版本记录,版本记录包括数据值、事务标识和版本号,事务标识为生成版本记录的事务的标识;修改模块703用于:
若第一数据的版本号最大的版本记录中的版本号不是锁版本号,则在区块链账本中为第一数据新增一条版本号为锁版本号、事务标识为目标事务的标识的版本记录,以使目标事务对第一数据加锁,锁版本号是版本号所能取得的最大值;或者,若第一数据的版本号最大的版本记录中的版本号是锁版本号、且事务标识是目标事务的标识,则确定第一数据已被目标事务加锁;
根据一个第二交易携带的SQL语句对第一数据的版本记录中版本号为锁版本号的数据值进行修改。
可选地,提交模块704用于:
为目标事务分配提交版本号;
将区块链账本中版本号为锁版本号、且事务标识为目标事务的标识的所有版本记录中的版本号均修改为目标事务的提交版本号,以对区块链账本中被目标事务加锁的所有数据进行解锁。
可选地,该装置还包括:
判断模块,用于每接收到客户端发送的一个第二交易,若一个第二交易携带的SQL语句用于读取区块链账本中的第二数据,则判断第二数据是否被目标事务加锁;
第一读取模块,用于若第二数据已被目标事务加锁,则读取第二数据的版本记录中版本号为锁版本号的数据值;
第二读取模块,用于若第二数据未被目标事务加锁,则在可重复读隔离级别下,读取第二数据的版本记录中版本号小于目标事务的开始版本号的数据值中版本号最大的数据值,目标事务的开始版本号是在创建目标事务时分配的;在读已提交隔离级别下,读取第二数据的版本记录中除版本号为锁版本号之外的数据值中版本号最大的数据值。
可选地,该装置还包括:
回滚模块,用于若接收到客户端发送的携带有回滚语句的第四交易,则将区块链账本中版本号为锁版本号、且事务标识为目标事务的标识的所有版本记录进行删除,以对目标事务执行的多个SQL语句的修改数据进行回滚。
可选地,该装置还包括:
清理模块,用于在向区块链添加预设数量的区块后,清理区块链账本中的历史版本记录;或者,在每次事务提交时,清理区块链账本中的历史版本记录;或者,在每次事务读取区块链账本中的数据时,清理区块链账本中的历史版本记录。
可选地,清理模块用于:
将当前存活的事务的开始版本号中最小的开始版本号作为目标版本号,事务的开始版本号是在事务创建时分配的;
对于区块链账本中的每一个数据,将一个数据的版本记录中版本号小于目标版本号的版本记录作为一个数据的目标版本记录;
删除一个数据的目标版本记录中除版本号最大的版本记录之外的其他历史版本记录。
在本申请实施例中,客户端向区块链系统发送携带有启动事务语句的第一交易指示区块链系统创建目标事务后,客户端可以不断向区块链系统发送携带有SQL语句的多个第二交易,以指示区块链系统将多个SQL语句作为一个事务进行执行。区块链系统创建目标事务后,每接收到客户端发送的一个第二交易,就可以对这个第二交易携带的SQL语句进行执行,具体地,若这个第二交易携带的SQL语句用于修改区块链账本中的第一数据,则在目标事务对第一数据加锁的情况下,根据这个第二交易携带的SQL语句修改第一数据。之后,客户端可以向区块链系统发送携带有提交语句的第三交易,区块链系统接收到第三交易后,可以对区块链账本中被目标事务加锁的所有数据进行解锁,以对目标事务执行的多个SQL语句的修改数据进行提交。如此,在区块链系统中实现了对事务的支持,即实现了在区块链系统将客户端发送的多个SQL语句作为一个事务进行执行,以此提高了区块链系统执行SQL语句的灵活性和准确性,从而提高了业务适用性。
需要说明的是:上述实施例提供的事务执行装置在事务执行时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。
上述实施例中的各功能单元、模块可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中,上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。另外,各功能单元、模块的具体名称也只是为了便于相互区分,并不用于限制本申请实施例的保护范围。
上述实施例提供的事务执行装置与事务执行方法实施例属于同一构思,上述实施例中单元、模块的具体工作过程及带来的技术效果,可参见方法实施例部分,此处不再赘述。
图8为本申请实施例提供的一种计算机设备的结构示意图。如图8所示,计算机设备8包括:处理器80、存储器81以及存储在存储器81中并可在处理器80上运行的计算机程序82,处理器80执行计算机程序82时实现上述实施例中的事务执行方法中由区块链系统执行的步骤。
计算机设备8可以是包括多台服务器的服务器集群,具体可以是区块链系统。本领域技术人员可以理解,图8仅仅是计算机设备8的举例,并不构成对计算机设备8的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,比如还可以包括输入输出设备、网络接入设备等。
处理器80可以是中央处理单元(Central Processing Unit,CPU),处理器80还可以是其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者也可以是任何常规的处理器。
存储器81在一些实施例中可以是计算机设备8的内部存储单元,比如计算机设备8的硬盘或内存。存储器81在另一些实施例中也可以是计算机设备8的外部存储设备,比如计算机设备8上配备的插接式硬盘、智能存储卡(Smart Media Card,SMC)、安全数字(SecureDigital,SD)卡、闪存卡(Flash Card)等。进一步地,存储器81还可以既包括计算机设备8的内部存储单元也包括外部存储设备。存储器81用于存储操作系统、应用程序、引导装载程序(Boot Loader)、数据以及其他程序等。存储器81还可以用于暂时地存储已经输出或者将要输出的数据。
本申请实施例还提供了一种计算机设备,该计算机设备包括:至少一个处理器、存储器以及存储在该存储器中并可在该至少一个处理器上运行的计算机程序,该处理器执行该计算机程序时实现上述任意各个方法实施例中的步骤。
本申请实施例还提供了一种计算机可读存储介质,该计算机可读存储介质存储有计算机程序,该计算机程序被处理器执行时可实现上述各个方法实施例中的步骤。
本申请实施例提供了一种计算机程序产品,当其在计算机上运行时,使得计算机执行上述各个方法实施例中的步骤。
集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请实现上述方法实施例中的全部或部分流程,可以通过计算机程序来指令相关的硬件来完成,该计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,该计算机程序包括计算机程序代码,该计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。该计算机可读介质至少可以包括:能够将计算机程序代码携带到拍照装置/终端设备的任何实体或装置、记录介质、计算机存储器、ROM(Read-Only Memory,只读存储器)、RAM(Random Access Memory,随机存取存储器)、CD-ROM(Compact Disc Read-Only Memory,只读光盘)、磁带、软盘和光数据存储设备等。本申请提到的计算机可读存储介质可以为非易失性存储介质,换句话说,可以是非瞬时性存储介质。
应当理解的是,实现上述实施例的全部或部分步骤可以通过软件、硬件、固件或者其任意结合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。该计算机程序产品包括一个或多个计算机指令。该计算机指令可以存储在上述计算机可读存储介质中。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述或记载的部分,可以参见其它实施例的相关描述。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
在本申请所提供的实施例中,应该理解到,所揭露的装置/计算机设备和方法,可以通过其它的方式实现。例如,以上所描述的装置/计算机设备实施例仅仅是示意性的,例如,模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通讯连接可以是通过一些接口,装置或单元的间接耦合或通讯连接,可以是电性,机械或其它的形式。
作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
以上所述实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围,均应包含在本申请的保护范围之内。
Claims (11)
1.一种事务执行方法,其特征在于,应用于区块链系统,所述方法包括:
接收到客户端发送的携带有启动事务语句的第一交易后,创建目标事务;
接收所述客户端发送的多个第二交易,所述多个第二交易中的每个第二交易均携带有需所述目标事务执行的用于操作区块链账本的结构化查询语言SQL语句;
每接收到所述客户端发送的一个第二交易,若所述一个第二交易携带的SQL语句用于修改所述区块链账本中的第一数据,则在所述目标事务对所述第一数据加锁的情况下,根据所述一个第二交易携带的SQL语句修改所述第一数据;
若接收到所述客户端发送的携带有提交语句的第三交易,则对所述区块链账本中被所述目标事务加锁的所有数据进行解锁,以对所述目标事务执行的多个SQL语句的修改数据进行提交。
2.如权利要求1所述的方法,其特征在于,所述方法还包括:
每接收到所述客户端发送的一个第二交易,对所述一个第二交易携带的SQL语句进行解析,得到解析结果,所述解析结果包括键值对和操作类型;
若所述操作类型为修改类型,则根据所述键值对中的key值在所述区块链账本中查找对应的数据作为所述一个第二交易携带的SQL语句需修改的所述第一数据。
3.如权利要求1所述的方法,其特征在于,所述区块链账本中的数据具有一条或多条版本记录,所述版本记录包括数据值、事务标识和版本号,所述事务标识为生成所述版本记录的事务的标识;
所述在所述目标事务对所述第一数据加锁的情况下,根据所述一个第二交易携带的SQL语句修改所述第一数据,包括:
若所述第一数据的版本号最大的版本记录中的版本号不是锁版本号,则在所述区块链账本中为所述第一数据新增一条版本号为所述锁版本号、事务标识为所述目标事务的标识的版本记录,以使所述目标事务对所述第一数据加锁,所述锁版本号是版本号所能取得的最大值;或者,若所述第一数据的版本号最大的版本记录中的版本号是所述锁版本号、且事务标识是所述目标事务的标识,则确定所述第一数据已被所述目标事务加锁;
根据所述一个第二交易携带的SQL语句对所述第一数据的版本记录中版本号为所述锁版本号的数据值进行修改。
4.如权利要求3所述的方法,其特征在于,所述对所述区块链账本中被所述目标事务加锁的所有数据进行解锁,包括:
为所述目标事务分配提交版本号;
将所述区块链账本中版本号为锁版本号、且事务标识为所述目标事务的标识的所有版本记录中的版本号均修改为所述目标事务的提交版本号,以对所述区块链账本中被所述目标事务加锁的所有数据进行解锁。
5.如权利要求3所述的方法,其特征在于,所述方法还包括:
每接收到所述客户端发送的一个第二交易,若所述一个第二交易携带的SQL语句用于读取所述区块链账本中的第二数据,则判断所述第二数据是否被所述目标事务加锁;
若所述第二数据已被所述目标事务加锁,则读取所述第二数据的版本记录中版本号为所述锁版本号的数据值;
若所述第二数据未被所述目标事务加锁,则在可重复读隔离级别下,读取所述第二数据的版本记录中版本号小于所述目标事务的开始版本号的数据值中版本号最大的数据值,所述目标事务的开始版本号是在创建所述目标事务时分配的;在读已提交隔离级别下,读取所述第二数据的版本记录中除版本号为所述锁版本号之外的数据值中版本号最大的数据值。
6.如权利要求3所述的方法,其特征在于,所述方法还包括:
若接收到所述客户端发送的携带有回滚语句的第四交易,则将所述区块链账本中版本号为所述锁版本号、且事务标识为所述目标事务的标识的所有版本记录进行删除,以对所述目标事务执行的多个SQL语句的修改数据进行回滚。
7.如权利要求3-6任一所述的方法,其特征在于,所述方法还包括:
在向区块链添加预设数量的区块后,清理所述区块链账本中的历史版本记录;或者,
在每次事务提交时,清理所述区块链账本中的历史版本记录;或者,
在每次事务读取所述区块链账本中的数据时,清理所述区块链账本中的历史版本记录。
8.如权利要求7所述的方法,其特征在于,所述清理所述区块链账本中的历史版本记录,包括:
将当前存活的事务的开始版本号中最小的开始版本号作为目标版本号,所述事务的开始版本号是在所述事务创建时分配的;
对于所述区块链账本中的每一个数据,将所述一个数据的版本记录中版本号小于所述目标版本号的版本记录作为所述一个数据的目标版本记录;
删除所述一个数据的目标版本记录中除版本号最大的版本记录之外的其他历史版本记录。
9.一种事务执行装置,其特征在于,应用于区块链系统,所述装置包括:
创建模块,用于接收到客户端发送的携带有启动事务语句的第一交易后,创建目标事务;
接收模块,用于接收所述客户端发送的多个第二交易,所述多个第二交易中的每个第二交易均携带有需所述目标事务执行的用于操作区块链账本的结构化查询语言SQL语句;
修改模块,用于每接收到所述客户端发送的一个第二交易,若所述一个第二交易携带的SQL语句用于修改所述区块链账本中的第一数据,则在所述目标事务对所述第一数据加锁的情况下,根据所述一个第二交易携带的SQL语句修改所述第一数据;
提交模块,用于若接收到所述客户端发送的携带有提交语句的第三交易,则对所述区块链账本中被所述目标事务加锁的所有数据进行解锁,以对所述目标事务执行的多个SQL语句的修改数据进行提交。
10.一种计算机设备,其特征在于,所述计算机设备包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如权利要求1至8任一项所述的方法。
11.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1至8任一项所述的方法。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111677879.XA CN114328591A (zh) | 2021-12-31 | 2021-12-31 | 事务执行方法、装置、设备和存储介质 |
PCT/CN2022/118805 WO2023124242A1 (zh) | 2021-12-31 | 2022-09-14 | 事务执行方法、装置、设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111677879.XA CN114328591A (zh) | 2021-12-31 | 2021-12-31 | 事务执行方法、装置、设备和存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114328591A true CN114328591A (zh) | 2022-04-12 |
Family
ID=81022758
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111677879.XA Pending CN114328591A (zh) | 2021-12-31 | 2021-12-31 | 事务执行方法、装置、设备和存储介质 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN114328591A (zh) |
WO (1) | WO2023124242A1 (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2023124242A1 (zh) * | 2021-12-31 | 2023-07-06 | 杭州趣链科技有限公司 | 事务执行方法、装置、设备和存储介质 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108804112B (zh) * | 2018-05-22 | 2022-02-11 | 上海分布信息科技有限公司 | 一种区块链落账处理方法及系统 |
US11836130B2 (en) * | 2019-10-10 | 2023-12-05 | Unisys Corporation | Relational database blockchain accountability |
CN111475262B (zh) * | 2020-04-02 | 2024-02-06 | 百度国际科技(深圳)有限公司 | 区块链中事务请求处理方法、装置、设备和介质 |
CN114328591A (zh) * | 2021-12-31 | 2022-04-12 | 杭州趣链科技有限公司 | 事务执行方法、装置、设备和存储介质 |
-
2021
- 2021-12-31 CN CN202111677879.XA patent/CN114328591A/zh active Pending
-
2022
- 2022-09-14 WO PCT/CN2022/118805 patent/WO2023124242A1/zh unknown
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2023124242A1 (zh) * | 2021-12-31 | 2023-07-06 | 杭州趣链科技有限公司 | 事务执行方法、装置、设备和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
WO2023124242A1 (zh) | 2023-07-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11429641B2 (en) | Copying data changes to a target database | |
CN111143389B (zh) | 事务执行方法、装置、计算机设备及存储介质 | |
CN109739935B (zh) | 数据读取方法、装置、电子设备以及存储介质 | |
CN109923534B (zh) | 对具有未提交事务的数据库记录的多版本并发控制 | |
EP3117348B1 (en) | Systems and methods to optimize multi-version support in indexes | |
CN109710388B (zh) | 数据读取方法、装置、电子设备以及存储介质 | |
US10191932B2 (en) | Dependency-aware transaction batching for data replication | |
JP5259404B2 (ja) | データベースフラグメントのクローン化および管理 | |
US11132350B2 (en) | Replicable differential store data structure | |
US6772155B1 (en) | Looking data in a database system | |
US20190129894A1 (en) | Database Transaction Processing Method, Client, and Server | |
US10754854B2 (en) | Consistent query of local indexes | |
CN111522631B (zh) | 分布式事务处理方法、装置、服务器及介质 | |
CN108509462B (zh) | 一种同步活动事务表的方法及装置 | |
US9576038B1 (en) | Consistent query of local indexes | |
CN111736964B (zh) | 事务处理方法、装置、计算机设备及存储介质 | |
JP7438603B2 (ja) | トランザクション処理方法、装置、コンピュータデバイス及びコンピュータプログラム | |
US20100125555A1 (en) | Efficient undo-processing during data redistribution | |
US20230110826A1 (en) | Log execution method and apparatus, computer device and storage medium | |
WO2023124242A1 (zh) | 事务执行方法、装置、设备和存储介质 | |
WO2022242401A1 (zh) | 一种数据库系统的事务处理方法、装置、电子设备、计算机可读存储介质及计算机程序产品 | |
JP2001282599A (ja) | データ管理方法および装置並びにデータ管理プログラムを格納した記録媒体 | |
CN114691307A (zh) | 事务处理方法及计算机系统 | |
CN112286992B (zh) | 一种查询方法、分布式系统、设备及存储介质 | |
US20240126747A1 (en) | Control method, and adapter |
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 |