本说明书实施例涉及区块链技术领域,更具体地,涉及一种在区块链中并发执行交易的方法和装置。
背景技术:
区块链技术是构建在点对点(p2p)网络上,利用链式数据结构来验证与存储数据,利用分布式节点共识算法来生成和更新数据,利用密码学的方式保证数据传输和访问的安全,利用由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算范式。区块链技术也被称之为分布式账本技术,是一种去中心化的分布式数据库技术,其特点是去中心化、公开透明、不可篡改、可信任。区块链的每笔数据,都会广播到全网的区块链节点,每个全节点都有全量的、一致的数据。区块链中的节点通过发送交易而进行转账、存入数据等业务,区块链中的记账节点在交易池中收集区块链中的交易,执行所述交易,并在执行所述交易之后,将这些交易打包到区块中并扩散到区块链中。区块链中的验证节点会对从记账节点发出的区块进行验证,在验证通过之后,每个节点在接收到该区块时,都会执行该区块中包括的每个交易。为了保证各个节点的数据一致性,各个节点中在执行区块中的多个交易时,对该多个交易的提交顺序需要是一致的,这样才能得到一致的执行结果。因此,在现有技术中,记账节点在执行交易之前会按照预定规则对将要执行的多个交易进行编号,并按照编号的顺序依次执行多个交易,也即依次提交多个交易,并且其它节点在接收到该区块之后,也是按照上述交易编号顺序依次执行并提交所述多个交易。然而,所述多个交易并不一定都是相互依赖的,在两个交易之间不存在依赖性的情况中,并发执行这两个交易并不影响最终的结果。而如果并发执行的两个交易存在依赖性,则该并发执行将影响到最终的结果。
因此,需要一种更有效的在区块链中并发执行多个交易的方法。
技术实现要素:
本说明书实施例旨在提供一种更有效的并发执行交易的方案,以解决现有技术中的不足。
为实现上述目的,本说明书一个方面提供一种在区块链中并发执行交易的方法,所述方法在区块链中的第一节点执行,所述第一节点中当前通过预设的预定数目的执行体并发执行交易,其中包括第一执行体,所述第一执行体当前在处理第一交易,所述方法由所述第一执行体执行,包括:
在处理第一交易的过程中进行预定操作之后,在共享内存中记录与第一交易对应的第一待处理任务、以及与该第一待处理任务对应的执行信息,以相对于所述第一交易进入等待过程;
对于所述共享内存中已经记录的多个待处理任务,确定其中是否存在等待过程结束的待处理任务,所述多个待处理任务由所述预定数目的执行体记录;以及
在确定第二待处理任务对应的等待过程结束的情况中,基于与所述第二待处理任务对应的执行信息,继续执行该第二待处理任务,其中,所述多个待处理任务中包括所述第二待处理任务。
在一个实施例中,所述方法还包括,在确定所述多个待处理任务各自的等待过程都未结束的情况中,从共享内存中的第一缓冲区获取待处理的第二交易,并开始执行所述第二交易。
在一个实施例中,所述共享内存中包括第二缓冲区,其中,在处理第一交易的过程中进行预定操作之后,在共享内存中记录与第一交易对应的第一待处理任务、以及与该第一待处理任务对应的执行信息包括,在处理完成第一交易之后,在确定第二交易未提交的情况中,在所述第二缓冲区中记录与第一交易对应的第一待处理任务,其中,所述第二交易根据预定提交顺序为所述第一交易的前一个交易。
在一个实施例中,对于所述共享内存中已经记录的多个待处理任务,确定其中是否存在等待过程结束的待处理任务包括,基于共享内存中记录的当前应提交的交易,确定所述第二缓冲区中对应于最小交易编号的待处理任务的等待过程是否结束,以确定所述第二缓冲区中是否存在等待过程结束的待处理任务,其中,所述交易编号对应于交易的提交顺序。
在一个实施例中,在确定第二待处理任务对应的等待过程结束的情况中,基于与所述第二待处理任务对应的执行信息,继续执行该第二待处理任务包括,在确定所述第二缓冲区中的第二待处理任务的等待过程结束的情况中,基于与所述第二待处理任务对应的执行信息,继续执行对第三交易的提交,其中所述第二待处理任务与所述第三交易相对应。
在一个实施例中,所述共享内存中包括第三缓冲区,所述第一交易中包括对第一变量的读取操作,其中,在处理第一交易的过程中进行预定操作之后,在共享内存中记录与第一交易对应的第一待处理任务、以及与该第一待处理任务对应的执行信息包括,在请求对所述第一变量的读取之后,在所述第三缓冲区中记录与第一交易对应的第一待处理任务,其中,所述第一待处理任务中包括对所述第一变量的记录。
在一个实施例中,所述第三缓冲区中包括所述第二待处理任务,所述第二待处理任务与第二交易中对第二变量的读取操作相对应,对于所述共享内存中已经记录的多个待处理任务,确定其中是否存在等待过程结束的待处理任包括,确定所述第二变量的变量值是否被返回,在确定所述第二变量的变量值被返回的情况中,确定该第二待处理任务的等待过程结束。
在一个实施例中,对于所述共享内存中已经记录的多个待处理任务,确定其中是否存在等待过程结束的待处理任务包括,对于所述第三缓冲区中已经记录的多个待处理任务,基于各个待处理任务对应的交易编号从小至大的顺序,依次确定各个待处理任务的等待过程是否结束,其中,所述第二待处理任务为首次确定的等待过程结束的待处理任务,其中,所述交易编号对应于交易的预定提交顺序。
在一个实施例中,确定所述第二变量的变量值是否被返回包括,基于在共享内存中的预定地址是否存储有第二变量的变量值,确定所述第二变量的变量值是否被返回,其中,所述预定地址与所述第二交易相对应。
在一个实施例中,在确定第二待处理任务对应的等待过程结束的情况中,基于与所述第二待处理任务对应的执行信息,继续执行该第二待处理任务包括,在确定所述第三缓冲区中存在等待过程结束的第二待处理任务的情况中,基于与所述第二待处理任务对应的执行信息和所述第二变量的变量值,继续执行所述第二交易。
在一个实施例中,所述共享内存中包括第四缓冲区,所述第一交易中包括对第一变量的读取操作,其中,在处理第一交易的过程中进行预定操作之后,在共享内存中记录与第一交易对应的第一待处理任务、以及与该第一待处理任务对应的执行信息包括,在执行到所述读取操作的代码之后,确定提交顺序在第一交易之前、且未提交的各个交易是否为已执行了对第一变量的写操作的冲突交易,所述各个交易中包括第二交易,在确定所述第二交易为距离第一交易最近的冲突交易的情况中,在第四缓冲区中记录与第一交易对应的第一待处理任务,其中,所述第一待处理任务中包括对第二交易的记录。
在一个实施例中,对于所述共享内存中已经记录的多个待处理任务,确定其中是否存在等待过程结束的待处理任务包括,基于共享内存中记录的当前应提交的交易,确定在所述第四缓冲区中记录的多个待处理任务中是否存在等待过程结束的待处理任务。
在一个实施例中,所述共享内存中包括第五缓冲区,所述第一交易中包括对第一变量的读取操作,其中,在处理第一交易的过程中进行预定操作之后,在共享内存中记录与第一交易对应的第一待处理任务、以及与该第一待处理任务对应的执行信息包括,在执行到所述读取操作的代码之后,推断提交顺序在第一交易之前、且未提交的各个交易是否为将要对第一变量进行写操作的冲突交易,所述各个交易中包括第二交易,在推断所述第二交易为距离第一交易最近的冲突交易的情况中,在所述第五缓冲区中记录与第一交易对应的第一待处理任务,其中,所述第一待处理任务中包括对第二交易的记录。
在一个实施例中,所述共享内存中包括至少一个缓冲区,所述至少一个缓冲区与至少一种待处理任务分别对应,其中,对于所述共享内存中已经记录的多个待处理任务,确定其中是否存在等待过程结束的待处理任务包括,基于所述至少一个缓冲区的预定顺序,确定各个缓冲区中是否存在等待过程结束的待处理任务。
本说明书另一方面提供一种在区块链中并发执行交易的装置,所述装置部署在区块链中的第一节点中的第一执行体中,所述第一节点中当前通过预设的预定数目的执行体并发执行交易,其中包括第一执行体,所述第一执行体当前在处理所述第一交易,所述装置,包括:
记录单元,配置为,在处理第一交易的过程中进行预定操作之后,在共享内存中记录与第一交易对应的第一待处理任务、以及与该第一待处理任务对应的执行信息,以相对于所述第一交易进入等待过程;
确定单元,配置为,对于所述共享内存中已经记录的多个待处理任务,确定其中是否存在等待过程结束的待处理任务,所述多个待处理任务由所述预定数目的执行体记录;以及
继续执行单元,配置为,在确定第二待处理任务对应的等待过程结束的情况中,基于与所述第二待处理任务对应的执行信息,继续执行该第二待处理任务,其中,所述多个待处理任务中包括所述第二待处理任务。
在一个实施例中,所述装置还包括,交易执行单元,配置为,在确定所述多个待处理任务各自的等待过程都未结束的情况中,从共享内存中的第一缓冲区获取待处理的第二交易,并开始执行所述第二交易。
在一个实施例中,所述共享内存中包括第二缓冲区,其中,所述记录单元还配置为,在处理完成第一交易之后,在确定第二交易未提交的情况中,在所述第二缓冲区中记录与第一交易对应的第一待处理任务,其中,所述第二交易根据预定提交顺序为所述第一交易的前一个交易。
在一个实施例中,所述确定单元还配置为,基于共享内存中记录的当前应提交的交易,确定所述第二缓冲区中对应于最小交易编号的待处理任务的等待过程是否结束,以确定所述第二缓冲区中是否存在等待过程结束的待处理任务,其中,所述交易编号对应于交易的提交顺序。
在一个实施例中,所述继续执行单元还配置为,在确定所述第二缓冲区中的第二待处理任务的等待过程结束的情况中,基于与所述第二待处理任务对应的执行信息,继续执行对第三交易的提交,其中所述第二待处理任务与所述第三交易相对应。
在一个实施例中,所述共享内存中包括第三缓冲区,所述第一交易中包括对第一变量的读取操作,其中,所述记录单元还配置为,在请求对所述第一变量的读取之后,在所述第三缓冲区中记录与第一交易对应的第一待处理任务,其中,所述第一待处理任务中包括对所述第一变量的记录。
在一个实施例中,所述第三缓冲区中包括所述第二待处理任务,所述第二待处理任务与第二交易中对第二变量的读取操作相对应,所述确定单元还配置为,确定所述第二变量的变量值是否被返回,在确定所述第二变量的变量值被返回的情况中,确定该第二待处理任务的等待过程结束。
在一个实施例中,所述确定单元还配置为,对于所述第三缓冲区中已经记录的多个待处理任务,基于各个待处理任务对应的交易编号从小至大的顺序,依次确定各个待处理任务的等待过程是否结束,其中,所述第二待处理任务为首次确定的等待过程结束的待处理任务,其中,所述交易编号对应于交易的预定提交顺序。
在一个实施例中,所述确定单元还配置为,基于在共享内存中的预定地址是否存储有第二变量的变量值,确定所述第二变量的变量值是否被返回,其中,所述预定地址与所述第二交易相对应。
在一个实施例中,所述继续执行单元还配置为,在确定所述第三缓冲区中存在等待过程结束的第二待处理任务的情况中,基于与所述第二待处理任务对应的执行信息和所述第二变量的变量值,继续执行所述第二交易。
在一个实施例中,所述共享内存中包括第四缓冲区,其中,所述记录单元还配置为,在执行到所述读取操作的代码之后,确定提交顺序在第一交易之前、且未提交的各个交易是否为已执行了对第一变量的写操作的冲突交易,所述各个交易中包括第二交易,在确定所述第二交易为距离第一交易最近的冲突交易的情况中,在第四缓冲区中记录与第一交易对应的第一待处理任务,其中,所述第一待处理任务中包括对第二交易的记录。
在一个实施例中,所述确定单元还配置为,基于共享内存中记录的当前应提交的交易,确定在所述第四缓冲区中记录的多个待处理任务中是否存在等待过程结束的待处理任务。
在一个实施例中,所述共享内存中包括第五缓冲区,所述第一交易中包括对第一变量的读取操作,其中,所述记录单元还配置为,在执行到所述读取操作的代码之后,推断提交顺序在第一交易之前、且未提交的各个交易是否为将要对第一变量进行写操作的冲突交易,所述各个交易中包括第二交易,在推断所述第二交易为距离第一交易最近的冲突交易的情况中,在所述第五缓冲区中记录与第一交易对应的第一待处理任务,其中,所述第一待处理任务中包括对第二交易的记录。
在一个实施例中,所述共享内存中包括至少一个缓冲区,所述至少一个缓冲区与至少一种待处理任务分别对应,其中,所述确定单元还配置为,基于所述至少一个缓冲区的预定顺序,确定各个缓冲区中是否存在等待过程结束的待处理任务。
本说明书另一方面提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执上述任一项方法。
本说明书另一方面提供一种计算设备,包括存储器和处理器,其特征在于,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现上述任一项方法。
通过根据本说明书实施例的并发执行交易的方案,在执行体执行交易过程中需要等待时记录对该交易的处理信息,并从共享内存中获取其它待处理任务或其它待处理交易进行处理,从而减少了执行体的等待时间,加快了交易并发执行的总体速度。
附图说明
通过结合附图描述本说明书实施例,可以使得本说明书实施例更加清楚:
图1示出根据本说明书实施例的区块链系统示意图;
图2示出在区块链中各个节点通过多个线程并发执行交易的示意图;
图3示出根据本说明书一个实施例的一种在区块链中并发执行交易的方法流程图;
图4示出根据本说明书一个实施例的一种在区块链中并发执行交易的装置400。
具体实施方式
下面将结合附图描述本说明书实施例。
图1示出根据本说明书实施例的区块链系统示意图。如图1所示,所述系统中包括构成区块链的多个节点(图中示意示出6个节点),这些节点两两相连,其中例如包括节点11、节点12和节点13。如本领域技术人员所知,在区块链中,一些节点会收集区块链中的多个交易放入交易池中并竞争记账权。例如图中的节点11通过获取记账权而成为记账节点。节点11在成为记账节点之后会执行其交易池中的多个交易,并将该多个交易打包成区块发送给其它节点,例如发送给节点12。节点12将会对该区块进行验证,并同样地执行该区块中的多个交易。在预定数目个节点对该区块进行验证之后,也即对该区块达到了共识,区块链中的其它节点(例如节点13)将不需要继续对该区块进行验证,而是直接对该区块中的交易进行执行,以更新本地的相关数据。
图2示出在区块链中各个节点通过多个线程并发执行交易的示意图。可以理解,所述线程也可以替换为进程、协程等执行体。如图2中所示,在每个节点中,通常,cpu的数目是有限的,预设的线程的数目也是固定的,例如,假设该节点的cpu数为4个,线程池中预设的线程数目为6个,从而6个线程竞争抢占cpu,并且只有在抢占到cpu之后,才能开始执行任务池中的任务。
在多个线程并发执行多个交易的过程中,所述多个交易中可能涉及到对多个变量的计算,在两个交易中不涉及相同的变量的情况中,其执行顺序并不会影响最终的计算结果,而在两个交易中涉及相同的变量的情况中,其执行顺序将会影响最终的计算结果。在本说明书实施例中,为了保证各个节点对多个交易的执行结果是相同的,在并发执行多个交易的同时,考虑交易之间对访问变量的冲突,从而使得并行执行的线程中的一些线程需要经过等待过程。或者在等待返回访问存储时需要进行等待。
如图2中所示,该图中包括第一节点的共享内存,该共享内存中例如包括用于指示待处理交易的缓冲区1,该共享内存是相对于全部线程可读写的。例如,第一缓冲区中当前记录了10个待处理的交易1、2、…10,其中,图中数字1、2、…、10对应的位框中初始应都为1,表示,其都是待处理的交易,其中,交易1~10的编号对应于各个交易的提交顺序。在开始并发执行交易之后,例如,线程1~4分别抢占到cpu1~4,从而,线程1~4可分别从第一缓冲区中获取一个任务进行处理,例如,线程1~4分别开始处理交易1~4,线程1~4在开始处理交易1~4之后,分别将第一缓冲区中交易1~4对应的位分别修改为0,以表示这些交易已经开始执行。可以理解,虽然图中示意示出,线程1抢占到cpu1,并执行交易1,线程2抢占到cpu2,并执行交易2等等,可以理解,图中所示内容仅是为了示意说明,线程的编号、cpu的编号和交易的编号并不是相互对应的,例如,线程1有可能抢占到cpu2,执行交易3等等。
图2中还示出了用于记录待处理任务的多个缓冲区,缓冲区2~5,其中,每个缓冲区与一种等待过程相对应。例如,缓冲区2与执行完交易等待提交的等待过程相对应,缓冲区3与请求读取以等待返回变量值的等待过程相对应,缓冲区4与在读取前基于变量写入记录等待在前交易提交的等待过程相对应,缓冲区5与在读取前基于交易冲突概率等待在前交易提交或写入的等待过程相对应。在本说明书实施例中,为了并发执行交易,执行交易的过程包括处理交易的过程和提交交易的过程,其中,所述处理交易的过程是将处理交易的结果存储到与该交易对应的缓冲区中,所述提交交易的过程是将最终的处理结果存储到各个交易共用的共享内存中。例如,当线程3处理完交易3之后,为了保证执行各个交易的最终结果一致,需要保证各个交易按照其编号顺序先后提交,因此,交易3需要等待前面的交易2提交之后再提交。在该情况中,线程3在缓冲区2中与交易3对应的位置进行记录,例如将初始的0改为1,然后,线程3到缓冲区中去获取新的任务。例如,线程3可首先检查缓冲区2中有没有等待过程结束的任务。图2中的共享内存中还记录了当前交易窗口,该当前交易窗口例如可由提交完交易的线程进行维护。例如,线程1在提交了交易1之后,可将该交易窗口中的首交易修改为2。从而交易窗口在待提交的多个交易中向后移动一位,当线程根据窗口首位而开始执行一个新交易(例如交易7)时,可将交易窗口中的末交易由6更新为7。在此时,例如,线程3在检查缓冲区2之后,可首先基于所述窗口确定交易2是否为当前应提交的交易。在缓冲区2中没有等待过程结束的任务的情况中,可以检查缓冲区3中有没有等待过程结束的任务,等等。在缓冲区2~5中都没有等待过程结束的任务的情况中,则可以从缓冲区1中获取待处理的交易,例如交易6。线程3当在执行交易6的过程中也遇到等待过程时,也将到缓冲区2~5中的相应的一个中记录下相应的待处理任务,例如,如图中右侧虚线箭头所示,线程3在缓冲区4中记录与交易6对应的待处理任务。然后,类似地,线程3首先在缓冲区2~5确定有没有等待过程结束的待处理任务。
可以理解,上文对图2的描述只是示意性地,而不是用于限制本说明书实施例的范围。例如,所述缓冲区1~5的具体形式不一定为图中所示形式,只要其能记录下相应的信息即可。下文将详细描述根据本说明书实施例的并发执行交易的过程。
图3示出根据本说明书一个实施例的一种在区块链中并发执行交易的方法流程图,所述方法在区块链中的第一节点执行,所述第一节点中预设有第一执行体,所述第一执行体当前在处理第一交易,所述方法由所述第一执行体执行,包括:
步骤s302,在处理第一交易的过程中进行预定操作之后,在共享内存中记录与第一交易对应的第一待处理任务、以及与该第一待处理任务对应的执行信息,以相对于所述第一交易进入等待过程;
步骤s304,对于所述共享内存中已经记录的多个待处理任务,确定其中是否存在等待过程结束的待处理任务;以及
步骤s306,在确定第二待处理任务对应的等待过程结束的情况中,基于与所述第二待处理任务对应的执行信息,继续执行该第二待处理任务,其中,所述多个待处理任务中包括所述第二待处理任务。
首先,在步骤s302,在处理第一交易的过程中进行预定操作之后,在共享内存中记录与第一交易对应的第一待处理任务、以及与该第一待处理任务对应的执行信息,以相对于所述第一交易进入等待过程。
如上文中参考图2所述,所述第一执行体例如可以为线程、进程、协程等执行主体,所述共享内存相对于用于并发执行交易的多个执行体是共享的。下文中将以线程为例进行说明。
在节点中并发执行交易的过程中,对于其中一个正在执行的交易,可能会包括多个等待过程,所述等待过程可能是由于不同的原因引起的。
在一个实施例中,如上文中参考图2中所述,所述多个并发执行的交易已经预设了预定的提交顺序,例如图2中的交易1~10必须按照其编号的从小到大的顺序进行先后提交,以保证各个节点对该多个交易的执行结果是相同的。这里,在节点中,线程在执行交易时,将处理结果先保存到仅与该交易对应的缓冲区中,而在提交之后,才将该执行结果保存到各个交易共用的共享内存中。例如,在处理第一交易的过程中,需要对第一变量进行写操作,则在仅与第一交易对应的缓冲区中先保存该写操作之后的第一变量的值,该值仅在处理该第一交易时可以使用,在处理其它交易时并不会对该值进行读写。而在提交第一交易之后,第一交易的值被存到共享内存中,其它交易也可以读取到该值,或者通过提交对该值进行修改。
由于各个交易具有预定的提交顺序,因此,如图2中所示,例如所述第一交易为图2中的交易6,则第一执行体为图中的线程3。如果线程3在处理完交易6之后,交易6之前的交易还未提交,此时,线程3需要等待交易5提交完成之后才能进行对交易6的提交。这里,线程3可基于共享内存中预设的交易窗口参数确定交易5是否提交。通过该交易窗口控制可同时并发执行的交易的最大总数,该交易窗口的两边分别是当前并发执行的编号最小的交易和编号最大的交易,例如图2中的1和6表示当前并发执行的交易为交易1~6。从而,通过确定交易5是否为交易窗口中的最小交易,从而确定交易5当前是否应提交。在该情况中,线程3可如图2中所示,将缓冲区2中的与交易6对应的位修改为1,以添加一个与交易6对应的待处理任务,该待处理任务只有等到交易5提交之后才可以继续执行,同时,可将与该待处理任务对应的执行信息,也即交易6的当前处理信息存储到该共享内存中的例如与各个交易分别对应的执行信息缓冲区中。
在一个实施例中,交易6中包括对变量k1的读取操作,线程3在开始执行该读取操作的代码之后,向用于读取变量的硬件或线程发出对变量k1的读取请求,之后在图2中所示的缓冲区3中的与交易6对应的字节中记录“k1”,以添加一个与交易6对应的待处理任务,该待处理任务在等到变量k1的值返回之后才继续执行。
在一个实施例中,交易6中包括对变量k1的读取操作,线程3在开始执行该读取操作的代码之后,查询共享内存中的写入缓冲区,该写入缓冲区中记录了当前对各个交易的处理过程中对各个变量(包括变量k1)的写入情况。例如,写入缓冲区中仅记录了交易4对变量k1进行了写入,未记录交易5对变量k1的写入。由于,基于该记录,交易4在提交之后将改变共享内存中的变量表中的k1的值,因此,交易6需要在等待交易4提交之后再读取该变量k1的值,否则将读取错误的k1的值。线程3在进行该对写入缓冲区的检查之后,在图2中的缓冲区3中的与交易6对应的字节中记录“4”,以添加一个与交易6对应的待处理任务,所述“4”与交易4相对应,表示该待处理任务在等到交易4提交之后才可以继续执行。
在一个实施例中,交易6中包括对变量k1的读取操作。线程3在开始执行该读取操作的代码之后,推断正在并发执行的多个交易中提交顺序在交易6之前的各个交易(例如图2中的交易1~5)是否将要对变量k1进行写操作。在一种方法中,可预先基于该节点中的交易执行历史,确定各个变量的交易冲突概率,当变量k1的交易冲突概率大于预定阈值时,则可推断交易1~5都将要对变量k1进行写操作,从而,需要等交易5提交之后,再进行交易6中的读取操作,如果交易5在处理过程中将对k1的写入值写入共享内存中与交易5对应的缓冲区(该缓冲区不是与各个交易对应的变量表)中,则可等交易5执行完对k1的写入后,进行对k1的读取。在一种方法中,线程3可基于交易6前面各个交易的交易数据,确定交易6与前面各个交易的冲突概率,并基于该冲突概率,推断所述各个交易是否将要对k1进行写操作,从而确定是否等待该交易的提交或写入。例如,在确定交易4对k1的写入概率大于等于预定阈值、且交易5对k1的写入概率小于预定阈值的情况中,线程3在图2中的缓冲区5中与交易6对应的字节中记录“4”,以记录一个与交易6对应的待执行任务,该待执行任务只有等到交易4提交或写入之后才可以继续执行。
上文虽然列举了四种等待情况,然而,本说明书实施例中的等待情况不限于上述四种情况,而是可以为任意由预定操作触发的等待情况。
在步骤s304,对于所述共享内存中已经记录的多个待处理任务,确定其中是否存在等待过程结束的待处理任务。
如上文中所述,所述共享内存中包括缓冲区2~5,其中分别记录了不同类型的待处理任务。例如,线程3在通过上述步骤s302在共享内存中存入与交易6对应的第一待处理任务之后,线程3以预定顺序检查共享内存中的缓冲区2~5,以用于获取其中的等待过程结束的待处理任务。可以理解,在图2中,所述缓冲区2~5中的待处理任务可以是由线程1~4中任一线程记录的待处理任务。
例如,首先,线程3可首先检查缓冲区2。如上文所述,缓冲区2中记录的各个待处理任务与处理完成等待提交的交易相对应。例如,如图2所示,在缓冲区2中,可确定对应位为1的最小交易为交易2,线程3可基于共享内存中的交易窗口确定当前应提交的交易是否为交易2,如果当前应提交的交易为交易2,则表示与交易2对应的该待处理任务等待过程结束,线程3可从共享内存中的用于存储交易执行信息的缓冲区中获取与交易2对应的执行信息,并基于该执行信息继续执行交易2,即进行对交易2的提交。
在线程3在缓冲区2中没有发现等待过程结束的待处理任务的情况中,线程3例如可检查缓冲区3。如上文所述,缓冲区3中记录的各个待处理任务都在等待相应变量值的返回。例如,缓冲区3中的与交易2对应的字节中记录有“k2”,则表示交易2在等待变量k2的值的返回。线程3可从与交易2对应的共享内存中的预定地址中确定是否已写入k2的值,在k2的值被写入的情况中,则表示与交易2对应的该待处理任务的等待过程结束,其中,所述预定地址与所述交易2相对应。其中,该k2的值可由执行读取操作的其它线程在该地址写入。在确定k2的值未被写入的情况中,可对交易2之后的待处理任务确定等待过程是否结束。例如,交易3对应的字节中记录了“k1”,则可在与交易3对应的预定地址确定是否已写入k1的值。
在线程3在缓冲区2和3中都没有发现等待过程结束的待处理任务的情况中,线程3例如可检查缓冲区4。如上文所述,缓冲区4中记录的待处理任务对应于基于写入情况等待其它交易提交以进行读取操作的交易。与检查缓冲区2类似地,线程3可基于共享内存中的交易窗口,确定例如交易2等待的交易1是否提交,在确定交易1提交的情况中,则与交易2对应的待处理任务的等待过程结束。在确定交易1未提交的情况中,线程3可以确定对应于交易2之后的交易的待处理任务的等待过程是否结束,例如可确定交易3对应的等待过程是否结束。
在线程3在缓冲区2~4都没有发现等待过程结束的待处理任务的情况中,线程3例如可检查缓冲区5。如上文所述,缓冲区5中记录的待处理任务对应于基于冲突概率等待其它交易提交或写入以进行读取操作的交易。线程3可类似地确定交易2等待的交易1是否提交,或者可基于交易1在处理过程中在共享内存中写入的变量值,确定与交易2对应的待处理任务的等待过程是否结束。
可以理解,上述共享内存中包括的缓冲区2~5仅仅是示意性地,而不是限制性的,上述检查缓冲区的顺序仅是示意性地,而不是限制性,在具体实施中,可根据场景的需要设置缓冲区、以及检查缓冲区的顺序。
在一个实施例中,在缓冲区2~5中都未检查到等待过程结束的待处理任务的情况中,线程3可检查图2中所示的共享内存中的缓冲区1,该缓冲区1中记录了待处理的交易,从而,线程3可以从该缓冲区1中获取编号最小的待处理交易(例如交易6),并开始执行该交易。
在步骤s306,在确定所述共享内存中存在等待过程结束的第二待处理任务的情况中,基于与所述第二待处理任务对应的执行信息,继续执行该第二待处理任务。
在一个实施例中,线程3在缓冲区2中获取等待过程结束的第二待处理任务,则线程3基于对应的执行信息,继续执行对该第二待处理任务对应的交易的提交。线程3在确定该第二待处理任务的等待过程结束之后,将缓冲区中相应的第二待处理任务去除,例如将缓冲区2中的第二待处理任务对应的“1”修改为0。
在一个实施例中,线程3在缓冲区3中获取第二待处理任务,则线程3基于相应的执行信息和相应的变量的值,继续执行相应的交易中读取操作后面的操作。
在一个实施例中,线程3在缓冲区4中获取第二待处理任务,则线程3基于相应的执行信息,继续执行相应的交易中的相应读取操作。
在一个实施例中,线程3在缓冲区5中获取第二待处理任务,则线程3基于相应的执行信息,继续执行相应的交易中的相应读取操作。
图4示出根据本说明书一个实施例的本说明书另一方面提供一种在区块链中并发执行交易的装置400,所述装置部署在区块链中的第一节点中的第一执行体中,所述第一节点中当前通过预设的预定数目的执行体并发执行交易,其中包括第一执行体,所述第一执行体当前在处理第一交易,所述装置,包括:
记录单元41,配置为,在处理第一交易的过程中进行预定操作之后,在共享内存中记录与第一交易对应的第一待处理任务、以及与该第一待处理任务对应的执行信息,以相对于所述第一交易进入等待过程;
确定单元42,配置为,对于所述共享内存中已经记录的多个待处理任务,确定其中是否存在等待过程结束的待处理任务,所述多个待处理任务由所述预定数目的执行体记录;以及
继续执行单元43,配置为,在确定第二待处理任务对应的等待过程结束的情况中,基于与所述第二待处理任务对应的执行信息,继续执行该第二待处理任务,其中,所述多个待处理任务中包括所述第二待处理任务。
在一个实施例中,所述装置还包括,交易执行单元44,配置为,在确定所述多个待处理任务各自的等待过程都未结束的情况中,从共享内存中的第一缓冲区获取待处理的第二交易,并开始执行所述第二交易。
在一个实施例中,所述共享内存中包括第二缓冲区,其中,所述记录单元41还配置为,在处理完成第一交易之后,在确定第二交易未提交的情况中,在所述第二缓冲区中记录与第一交易对应的第一待处理任务,其中,所述第二交易根据预定提交顺序为所述第一交易的前一个交易。
在一个实施例中,所述确定单元42还配置为,基于共享内存中记录的当前应提交的交易,确定所述第二缓冲区中对应于最小交易编号的待处理任务的等待过程是否结束,以确定所述第二缓冲区中是否存在等待过程结束的待处理任务,其中,所述交易编号对应于交易的提交顺序。
在一个实施例中,所述继续执行单元43还配置为,在确定所述第二缓冲区中的第二待处理任务的等待过程结束的情况中,基于与所述第二待处理任务对应的执行信息,继续执行对第三交易的提交,其中所述第二待处理任务与所述第三交易相对应。
在一个实施例中,所述共享内存中包括第三缓冲区,所述第一交易中包括对第一变量的读取操作,其中,所述记录单元41还配置为,在请求对所述第一变量的读取之后,在所述第三缓冲区中记录与第一交易对应的第一待处理任务,其中,所述第一待处理任务中包括对所述第一变量的记录。
在一个实施例中,所述第三缓冲区中包括所述第二待处理任务,所述第二待处理任务与第二交易中对第二变量的读取操作相对应,所述确定单元42还配置为,确定所述第二变量的变量值是否被返回,在确定所述第二变量的变量值被返回的情况中,确定该第二待处理任务的等待过程结束。
在一个实施例中,所述确定单元42还配置为,对于所述第三缓冲区中已经记录的多个待处理任务,基于各个待处理任务对应的交易编号从小至大的顺序,依次确定各个待处理任务的等待过程是否结束,其中,所述第二待处理任务为首次确定的等待过程结束的待处理任务,其中,所述交易编号对应于交易的预定提交顺序。
在一个实施例中,所述确定单元42还配置为,基于在共享内存中的预定地址是否存储有第二变量的变量值,确定所述第二变量的变量值是否被返回,其中,所述预定地址与所述第二交易相对应。
在一个实施例中,所述继续执行单元43还配置为,在确定所述第三缓冲区中存在等待过程结束的第二待处理任务的情况中,基于与所述第二待处理任务对应的执行信息和所述第二变量的变量值,继续执行所述第二交易。
在一个实施例中,所述共享内存中包括第四缓冲区,所述第一交易中包括对第一变量的读取操作,其中,所述记录单元41还配置为,在执行到所述读取操作的代码之后,确定提交顺序在第一交易之前、且未提交的各个交易是否为已执行了对第一变量的写操作的冲突交易,所述各个交易中包括第二交易,在确定所述第二交易为距离第一交易最近的冲突交易的情况中,在第四缓冲区中记录与第一交易对应的第一待处理任务,其中,所述第一待处理任务中包括对第二交易的记录。
在一个实施例中,所述确定单元42还配置为,基于共享内存中记录的当前应提交的交易,确定在所述第四缓冲区中记录的多个待处理任务中是否存在等待过程结束的待处理任务。
在一个实施例中,所述共享内存中包括第五缓冲区,所述第一交易中包括对第一变量的读取操作,其中,所述记录单元41还配置为,在执行到所述读取操作的代码之后,推断提交顺序在第一交易之前、且未提交的各个交易是否为将要对第一变量进行写操作的冲突交易,所述各个交易中包括第二交易,在推断所述第二交易为距离第一交易最近的冲突交易的情况中,在所述第五缓冲区中记录与第一交易对应的第一待处理任务,其中,所述第一待处理任务中包括对第二交易的记录。
在一个实施例中,所述共享内存中包括至少一个缓冲区,所述至少一个缓冲区与至少一种待处理任务分别对应,其中,所述确定单元42还配置为,基于所述至少一个缓冲区的预定顺序,确定各个缓冲区中是否存在等待过程结束的待处理任务。
本说明书另一方面提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执上述任一项方法。
本说明书另一方面提供一种计算设备,包括存储器和处理器,其特征在于,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现上述任一项方法。
通过根据本说明书实施例的并发执行交易的方案,在执行体执行交易过程中需要等待时记录对该交易的处理信息,并从共享内存中获取其它待处理任务或其它待处理交易进行处理,从而减少了执行体的等待时间,加快了交易并发执行的总体速度。
需要理解,本文中的“第一”,“第二”等描述,仅仅为了描述的简单而对相似概念进行区分,并不具有其他限定作用。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
本领域普通技术人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执轨道,取决于技术方案的特定应用和设计约束条件。本领域普通技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
结合本文中所公开的实施例描述的方法或算法的步骤可以用硬件、处理器执轨道的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(ram)、内存、只读存储器(rom)、电可编程rom、电可擦除可编程rom、寄存器、硬盘、可移动磁盘、cd-rom、或技术领域内所公知的任意其它形式的存储介质中。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。