在区块链中并发执行交易的方法和装置与流程

文档序号:23093080发布日期:2020-11-27 12:48阅读:133来源:国知局
在区块链中并发执行交易的方法和装置与流程

本说明书实施例涉及区块链技术领域,更具体地,涉及一种在区块链中并发执行交易的方法和装置。



背景技术:

区块链技术是构建在点对点(p2p)网络上,利用链式数据结构来验证与存储数据,利用分布式节点共识算法来生成和更新数据,利用密码学的方式保证数据传输和访问的安全,利用由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算范式。区块链技术也被称之为分布式账本技术,是一种去中心化的分布式数据库技术,其特点是去中心化、公开透明、不可篡改、可信任。区块链的每笔数据,都会广播到全网的区块链节点,每个全节点都有全量的、一致的数据。区块链中的节点通过发送交易而进行转账、存入数据等业务,区块链中的交易被打包到区块中发送给区块链中的各个节点,区块链中的节点通过执行区块中的各个交易而更新区块链的世界状态。为了保证各个节点的数据一致性,各个节点中在执行区块中的多个交易时,对该多个交易的提交顺序需要是一致的,这样才能得到一致的执行信息。因此,在现有技术中,记账节点在执行交易之前会按照预定规则对将要执行的多个交易进行编号,并按照编号的顺序依次执行多个交易,也即依次提交多个交易,并且其它节点在接收到该区块之后,也是按照上述交易编号顺序依次执行并提交所述多个交易。

在并发执行多个交易的方案中,为了保证交易提交顺序的一致性,线程在执行完交易之后,如果前面的交易还未提交,该线程需要等待前面的交易提交完成之后再进行提交或者交易重做。

因此,需要一种更有效的并发执行交易的方案。



技术实现要素:

本说明书实施例旨在提供一种更有效的并发执行交易的方案,以解决现有技术中的不足。

为实现上述目的,本说明书一个方面提供一种在区块链中并发执行交易的方法,包括:

由第一执行体获取当前待执行的第一交易;

执行所述第一交易;

将所述第一交易的执行信息存储到共享内存中;

在共享内存中记录所述第一交易的处理阶段为待提交阶段;

由第二执行体确定当前应提交的第一交易;

在共享内存中读取第一交易的处理阶段;

如果第一交易的处理阶段为待提交阶段,从共享内存中获取所述第一交易的执行信息;

提交所述第一交易的执行信息。

在一种实施方式中,所述方法还包括,在提交所述第一交易的执行信息之后,由第二执行体确定与所述第一交易之间存在变量访问冲突的第二交易;

对第二交易的处理阶段进行修改,以指示第二交易需要重做。

在一种实施方式中,所述方法还包括,所述第二执行体在确定当前应提交的第一交易之后,将所述第一交易的处理阶段修改为提交中阶段;在提交所述第一交易之后,将所述第一交易的处理阶段修改为已提交阶段。

在一种实施方式中,对第二交易的处理阶段进行修改,以指示第二交易需要重做包括:

如果所述第二交易的处理阶段为待提交阶段,则将所述第二交易的处理阶段修改为第一重做阶段;

如果所述第二交易的处理阶段为执行中阶段,则将所述第二交易的处理阶段修改为第二重做阶段。

在一种实施方式中,所述方法还包括:

在在共享内存中读取第一交易的处理阶段之后,如果所述共享内存中记录的所述第一交易的处理阶段为所述第一重做阶段,所述第二执行体重新执行所述第一交易;

提交所述第一交易。

在一种实施方式中,所述方法还包括,所述第一执行体在获取当前待执行的第一交易之后,将所述第一交易的处理阶段修改为执行中阶段,其中,在共享内存中记录所述第一交易的处理阶段为待提交阶段包括:

在共享内存中读取所述第一交易的处理阶段;

在所述读取的第一交易的处理阶段为所述执行中阶段的情况中,将所述第一交易的处理阶段修改为待提交阶段。

在一种实施方式中,所述方法还包括,在在共享内存中读取所述第一交易的处理阶段之后,在所述读取的第一交易的处理阶段为所述第二重做阶段的情况中,将所述第一交易的处理阶段修改为所述第一重做阶段。

在一种实施方式中,所述方法还包括,在第二执行体确定当前应提交的第一交易之后,第二执行体从所述共享内存中读取所述第一交易的处理阶段。

本说明书实施例提供一种在区块链中并发执行交易的装置,包括:

相对于第一执行体部署的:获取单元,配置为,获取当前待执行的第一交易;

执行单元,配置为,执行所述第一交易;

存储单元,配置为,将所述第一交易的执行信息存储到共享内存中;

记录单元,配置为,在共享内存中记录所述第一交易的处理阶段为待提交阶段;

相对于第二执行体部署的:第一确定单元,配置为,确定当前应提交的第一交易;

读取单元,配置为,如果所述共享内存中记录的所述第一交易的处理阶段为待提交阶段,从共享内存中获取所述第一交易的执行信息;

第一提交单元,配置为,提交所述第一交易的执行信息。

在一种实施方式中,所述装置还包括相对于所述第二执行体部署的:第二确定单元,配置为,在提交所述第一交易的执行信息之后,确定与所述第一交易之间存在变量访问冲突的第二交易;

第一修改单元,配置为,对第二交易的处理阶段进行修改,以指示第二交易需要重做。

在一种实施方式中,所述装置还包括相对于所述第二执行体部署的:第二修改单元,配置为,在确定当前应提交的第一交易之后,将所述第一交易的处理阶段修改为提交中阶段;第三修改单元,配置为,在提交所述第一交易之后,将所述第一交易的处理阶段修改为已提交阶段。

在一种实施方式中,所述第一修改单元包括:

第一修改子单元,配置为,如果所述第二交易的处理阶段为待提交阶段,则将所述第二交易的处理阶段修改为第一重做阶段;

第二修改子单元,配置为,如果所述第二交易的处理阶段为执行中阶段,则将所述第二交易的处理阶段修改为第二重做阶段。

在一种实施方式中,所述装置还包括相对于所述第二执行体部署的:

重新执行单元,配置为,在在共享内存中读取第一交易的处理阶段之后,如果所述共享内存中记录的所述第一交易的处理阶段为所述第一重做阶段,重新执行所述第一交易;

第二提交单元,配置为,提交所述第一交易。

在一种实施方式中,所述装置还包括相对于所述第一执行体部署的第四修改单元,配置为,在获取当前待执行的第一交易之后,将所述第一交易的处理阶段修改为执行中阶段,其中,所述记录单元包括:

读取子单元,配置为,在共享内存中读取所述第一交易的处理阶段;

修改子单元,配置为,在所述读取的第一交易的处理阶段为所述执行中阶段的情况中,将所述第一交易的处理阶段修改为待提交阶段。

在一种实施方式中,所述装置还包括相对于所述第一执行体部署的第五修改单元,配置为,在在共享内存中读取所述第一交易的处理阶段之后,在所述读取的第一交易的处理阶段为所述第二重做阶段的情况中,将所述第一交易的处理阶段修改为所述第一重做阶段。

本说明书另一方面提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行上述任一项方法。

本说明书另一方面提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现上述任一项方法。

通过根据本说明书实施例的并发执行交易的方案,将交易处理过程分为执行过程和提交过程两个过程进行调度,并通过交易的处理阶段变量记录交易的处理阶段以便于任务的调度,线程在执行完交易之后不需要等待前序交易提交之后再提交本交易,而可以结束交易的执行过程并继续处理其它任务,从而充分利用了线程资源,提高了系统性能。

附图说明

通过结合附图描述本说明书实施例,可以使得本说明书实施例更加清楚:

图1为根据本说明书实施例的在区块链中的节点通过多个线程并发执行交易的过程示意图;

图2示出根据本说明书实施例的一种在区块链中并发执行交易的方法流程图;

图3为根据本说明书实施例的通过调度线程调度工作线程以并发执行交易的方法流程图;

图4为根据本说明书实施例的通过线程1、线程2和线程3并发执行交易的过程示意图;

图5为与图3中的步骤s316对应的通过工作线程执行交易执行任务的方法流程图;

图6为与图3中的步骤s308对应的通过工作线程执行交易重做任务的方法流程图;

图7为与图3中的步骤s314对应的通过工作线程执行交易重做任务的方法流程图;

图8为与图3中的步骤s306对应的通过工作线程执行交易提交任务的方法流程图;

图9为步骤s810的执行过程示意图;

图10为根据本说明书实施例的通过工作线程并发执行交易的方法流程图;

图11为根据本说明书实施例的一种在区块链中并发执行交易的装置1100的示意图。

具体实施方式

下面将结合附图描述本说明书实施例。

图1为根据本说明书实施例的在区块链中的节点通过多个线程并发执行交易的过程示意图。可以理解,所述线程也可以替换为进程、协程等执行体。如图1中所示,在区块链的节点中,基于cpu的数目,线程池中预设的线程的数目例如为4个,即线程0~线程3,其中线程0为用于调度工作线程的调度线程,线程1~线程3为用于处理任务的工作线程。

具体是,如图1中所示,所述节点中包括共享内存,该共享内存是相对于全部线程可读写的。该共享内存中包括与多个交易分别对应的处理阶段变量,例如,图1中示出了与交易1(tx1)~tx6分别对应的处理阶段变量t1~t6。所述处理阶段变量的值用于指示相应交易的处理阶段,在本说明书实施例中,处理阶段变量的值例如可包括0~6七个值,其与处理阶段“等待执行”、“执行中”、“待提交”、“提交中”、“已提交”、“第一重做”和“第二重做”分别对应,其中第一重做阶段指示交易在等待提交时被标记为重做阶段,第二重做阶段指示交易在执行中被标记为重做阶段。可以理解,虽然这里将交易的处理阶段设置为7个阶段,本说明书实施例不限于此,可根据交易执行方法的需要设置任意数量的交易的处理阶段。所述共享内存中还包括提交位置变量(变量c)和执行位置变量(变量e),所述变量c的值用于指示当前应提交的交易(即当前未提交交易中的编号最小的交易)的编号,所述变量e的值用于指示当前等待执行的编号最小的交易的编号。其中,假设多个交易的编号从1开始计数,则在处理该多个交易之前,变量c和变量e的初始值都设置为1。

在多个线程开始执行多个交易之后,线程0可首先读取变量c的值,获取当前应提交交易的编号,例如如图1所示,当前应提交的交易为交易1,并且交易1的状态为提交中状态,即,线程1在进行对交易1的提交处理。此外,线程0基于变量e的值调度线程2执行交易2,调度线程3执行交易3。线程2在执行完成交易2之后,将交易2的处理阶段变量修改为2,以指示交易2正在等待提交,之后,线程2结束对交易2的执行。在交易1提交完成之后,线程0将变量c的值修改为2,即交易2变为应提交的交易。在该情况中,线程0可调度在执行完成交易3之后空闲的线程3来进行对交易2的提交。

在本说明书的上述实施例中,在多个线程并发执行多个交易的过程中,将交易处理过程分为执行过程和提交过程两个过程,可分别由两个线程分别基于交易的处理阶段变量的值执行交易的执行过程和提交过程,从而线程在执行完交易之后不需要等待前序交易提交之后再提交本交易,充分利用了线程资源。

可以理解,上文中虽然参考图1描述了根据本说明书实施例的并发执行交易的方法,本说明书实施例的方法不限于如上文所述。例如,所述多个线程中可以不包括调度线程,各个线程可以自己进行任务调度,共享内存中可不包括提交位置变量和执行位置变量,线程可以通过各个交易的处理阶段变量获取当前应提交的交易和当前等待执行的交易。

下文将详细描述根据本说明书实施例的并发执行交易的方法。

图2示出根据本说明书实施例的一种在区块链中并发执行交易的方法流程图,如图2所示,该方法例如由线程2和线程3共同处理交易2,其中包括:

在步骤s202,线程2获取当前待执行的交易2;

在步骤s204,线程2执行交易2;

在步骤s206,线程2将交易2的执行信息存储到共享内存中;

在步骤s208,线程2在共享内存中记录交2易的处理阶段为待提交阶段;

在步骤s210,线程3确定当前应提交的交易2;

在步骤s212,线程3在共享内存中读取交易2的处理阶段;

在步骤s214,如果交易2的处理阶段为待提交阶段,则线程3从共享内存中获取交易2的执行信息;

在步骤s216,线程3提交交易2的执行信息。

首先,在步骤s202,线程2例如通过线程0的调度获取待执行的交易2,具体是,线程2获取交易2的交易体。如图1中所示,线程0在调度线程2执行交易2之后会将变量e的值修改为3,以指示待执行交易的编号最小的交易为交易3。在不通过变量e来指示待执行交易的情况中,线程2在获取交易2之后,也可以将图1中的变量t2的值从0修改为1,以指示交易2的处理阶段为执行中阶段。

在步骤s204,线程2执行交易2。

线程2在执行交易2的过程中,将生成交易2的执行信息,该执行信息包括在执行交易2的过程中对账户状态或者变量状态的改变,例如,账户余额的改变、变量值的改变等等。

在步骤s206,线程2将交易2的执行信息存储到共享内存中。

如上文参考图1所述,所述共享内存为各个线程都可以读取的内存空间。在执行完成交易2之后,线程2可将交易2的执行信息存储到共享内存中分配给交易2的存储空间中。

在步骤s208,线程2在共享内存中记录交易2为待提交阶段。

即,线程2将共享内存中的变量t2的值修改为2,以指示交易2的处理阶段为待提交阶段。

在进行上述步骤之后,线程2对交易2的执行过程结束,线程2成为空闲线程,线程0可对线程2分配新的处理任务。

在步骤s210,线程3确定当前应提交的交易2。

如图1所示,当变量c的值变为2之后,表示交易2为当前应提交的交易,假设线程3当前为空闲线程,则线程0可分配线程3进行对交易2的提交,从而线程0可通知线程3当前应提交的交易为交易2。在另一种实施方式中,线程3可自身读取共享内存中的变量c,从而确定当前应提交的交易为交易2(参考下文对图10的描述)。

在步骤s212,线程3在共享内存中读取交易2的处理阶段。

在一种实施方式中,线程3在提交交易2之前,首先需要确定交易2的状态是否为待提交阶段,也就是确定交易2的处理阶段变量的值t2是否为2,因此,线程3可在共享内存中读取t2的值。

在另一种实施方式中,参考下文对图3的描述,线程0可读取t2的值,并在t2=2的情况中,调度线程3执行对交易2的提交,在该实施方式中,线程3不需要执行步骤s212,而可以直接执行步骤s214。

在步骤s214,如果交易为待提交阶段,线程3从共享内存中读取交易2的执行信息。

在t2的值为2的情况中,表示交易2已经被执行过,并且在共享内存中存储有交易2的执行信息。因此,线程3可从共享内存中的分配给交易2的存储空间中读取交易2的执行信息,以用于进行对交易2的提交。线程3在获取交易2的提交任务之后,可将交易2的处理阶段变量t2的值修改为3,以指示交易2的处理阶段为提交中阶段。

在步骤s216,线程3提交交易2的执行信息。

线程3在从共享内存中读取交易2的执行信息之后,可将该执行信息更新到内存中缓存的世界状态中,并可在区块中的全部交易执行完成之后更新到账户状态数据库中。线程3在完成对交易2的提交之后,可将共享内存中的t2的值修改为4,以指示交易2的处理阶段为已提交。

图2所示实施例中主要描述了:线程在执行完交易之后通过交易的处理阶段变量记录交易处于待提交阶段,从而使得另一个线程可基于该交易的待提交阶段进行对该交易的提交。在实际中,交易对世界状态的改变有可能影响后续交易的执行,即,这两个交易存在变量冲突,在该情况中,可通过使用处理阶段变量对该后续交易进行重做标记,从而解决变量冲突问题。下文将具体描述多个线程并发执行多个交易时的更详细的处理过程,包括上述变量冲突处理过程。

图3为根据本说明书实施例的通过调度线程调度工作线程以并发执行交易的方法流程图。如图3所示,首先在步骤s302,线程0读取变量c的值i,即确定当前应提交的交易的交易号。在步骤s304,读取处理阶段变量ti的值,即通过读取处理阶段变量ti的值确定交易txi的处理阶段。图4为根据本说明书实施例的通过线程1、线程2和线程3并发执行交易的过程示意图。如图4所示,在时间t0,线程0在读取变量c的值为1,读取处理阶段变量t1的值为0,即此时tx1在等待执行。在该情况中,如图3中所示,流程进入步骤s310,即读取变量e的值,此时变量e的值为1,即等待执行的最小交易为交易1,由于此时变量e和变量c的值都为1,即ti=tj,因此执行步骤s316,线程0调度空闲线程执行tx1执行任务,并将变量e的值加1,如图4中所示,在t0,线程1-线程3都是空闲线程,线程0调度线程1执行tx1执行任务。

图3所示流程是循环执行的,线程0在执行步骤s316之后将再次执行步骤s302,以进行循环调度。假设线程0在图4中的时间t1执行步骤s302,读取变量c的值i=2,在步骤s304,线程0读取处理阶段变量t2的值为2,即tx2的处理阶段为待执行处理阶段。从而,如图3所示,线程0执行步骤s306,调度空闲线程执行tx2提交任务,如图4所示,线程0调度线程3执行tx2提交任务。之后,线程0执行步骤s310,读取变量e的值为6。之后,线程0执行步骤s312,依次读取处理阶段变量t2与t6之间各个变量(即处理阶段变量t3~处理阶段变量t5)的值。首先读取处理阶段变量t3的值为5,即tx3的处理阶段为重做阶段,线程0执行步骤s314,调度空闲线程执行tx3重做任务,如图4中所示,线程0例如调度当前空闲的线程1执行tx3重做任务。之后,线程0读取了处理阶段变量t4和处理阶段变量t5并确定处理阶段变量t4和处理阶段变量t5的值都不是5,从而,线程0执行步骤s316,调度线程执行tx6执行任务,并将变量e的值加1,如图4所示,线程0调度线程3执行tx6执行任务。

假设线程0在时间t2再次执行步骤s302,读取变量c的值i=4,在步骤s304,线程0读取处理阶段变量t4的值为5,即tx4的处理阶段为重做阶段。从而,如图4所示,线程0执行步骤s308,调度空闲线程执行tx4重做任务。之后线程0将继续执行步骤s310等后续步骤。

如图3和图4所示,线程1、线程2和线程3在被调度之后执行以下任一任务:交易执行任务、交易提交任务和交易重新任务,下文将分别描述工作线程执行上述三种任务的过程。

图5为与图3中的步骤s316对应的通过工作线程执行交易执行任务的方法流程图。下面将通过多个实例描述图5所示流程。

例如,如图4所示,线程0在时间t0调度线程1执行tx1(即,j=1,交易j为tx1)执行任务,从而线程1通过图5所示流程来执行tx1执行任务。如图5所示,在步骤s501,线程1根据线程0的通知确定将执行tx1。在步骤s502,线程1将处理阶段变量t1的值修改为1,以表示tx1的处理阶段为执行中阶段。在步骤s503,线程1执行tx1。具体是,线程1将执行tx1过程中对变量的写入(即对世界状态的改变)记录到共享内存中的与tx1对应的执行信息中,从而完成对tx1的执行。在步骤s504,线程1读取变量c的值。如果读取变量c的值为1,从而,线程1执行步骤s505,读取处理阶段变量t1的值。由于tx1为第一个被执行的交易,因此不会有前面的交易将处理阶段变量t1标记为6,因此,这里处理阶段变量t1的值应为1。从而,线程1执行步骤s508,提交tx1。具体是,线程1将执行tx1的执行信息更新到内存中存储的世界状态中。之后,如后序图7中的交易提交任务流程所示,线程1还将确定与交易1存在访问冲突的交易,并对该交易标记重做,以及对变量c的值加1,这将在下文参考图7详细说明。在进行上述处理之后,线程1完成了本次任务,成为空闲线程,具体是,线程1可通过与线程1对应的位来记录线程1的处理阶段,例如,以0表示空闲处理阶段,以1表示工作处理阶段,从而,线程1在完成本次任务之后,可将该位修改为0,以供线程0调度。

在上述处理过程中,通过在步骤s504读取变量c的值,以确定交易1是否为当前应提交的交易,如果是就继续进行对交易1的提交,从而提高交易1的执行效率。然而,本说明书实施例不限于此,步骤s504~步骤s508是可选步骤。

在另一种实施方式中,线程1在执行步骤s503之后,可直接执行步骤s509,读取处理阶段变量t1的值,如上文所述,这里处理阶段变量t1=1,从而线程1执行步骤s511,将处理阶段变量t1的值修改为2,以等待提交。

再如图4所示,线程0调度线程2执行tx5。线程2在执行步骤s501~s503之后,执行步骤s504,确定变量c的当前值例如为5,从而,线程2执行步骤s505,假设此时其它在前交易将处理阶段变量t5的值标为6,从而线程2执行步骤s506,清空tx5的执行信息,然后执行步骤s507,执行tx5,之后,执行步骤s508,提交tx5。同样地,在另一种实施方式中,在执行步骤s503之后,线程2可以直接执行步骤s509,从而在确定处理阶段变量t5=6的情况中,执行步骤s510,将处理阶段变量t5修改为5,以等待重做。如果在步骤s509确定处理阶段变量t5的值不为6,即tx5不需要重做,则线程2执行步骤s511,将处理阶段变量t5修改为2,以等待提交。在进行上述处理之后,线程2成为空闲线程。

其中,由于在线程2执行步骤s511的同时,可能存在其它线程对处理阶段变量t5进行修改,例如其它线程将处理阶段变量t5修改为6。因此,在步骤s511中对处理阶段变量t5的修改应该是与其它线程互斥的。在一种实施方式中,处理阶段变量t5为原子变量,线程2对处理阶段变量t5进行原子比较修改操作(即一种原子操作),以将处理阶段变量t5的值从1修改为2。所述原子变量为原子操作的基本单位,所述原子变量可保证一系列原子操作不被打断,保证了线程操作的安全性,所述原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会换到另一个线程。线程2在执行上述原子比较修改操作时执行以下过程:读取处理阶段变量t5的值,确定处理阶段变量t5的值是否为1,如果是1,则将处理阶段变量t5的值修改为2,如果读取的处理阶段变量t5的值不是1,则不进行修改,返回该读取的处理阶段变量t5的值。

图6为与图3中的步骤s308对应的通过工作线程执行交易重做任务的方法流程图。

如图6所示,当调度线程(例如线程0)在步骤s308中调度工作线程(例如线程1)执行txi(例如图4中的tx4)的交易重做任务之后,线程1在步骤s601获取tx4的交易体。在步骤s602,线程1重新执行tx4,并将tx4的执行信息存储到共享内存中分配给tx4的存储空间中。线程1在重新开始执行tx4之后,可将tx4对应的处理阶段变量t4的值修改为1,以指示tx4的处理阶段为执行中阶段。参考图3和图4,由于tx4当前为应提交的交易,tx4之前的交易都已经提交,因此,在线程1开始重新执行tx4之后,不会因为前序交易的执行而将tx4标记为重做阶段。因此,线程1在执行txi的过程结束之后,可在步骤s603直接提交tx4,在提交tx4之后,线程1可将t4的值修改为4,以指示tx4的处理阶段为已提交阶段。

图7为与图3中的步骤s314对应的通过工作线程执行交易重做任务的方法流程图。下面将通过实例描述图7所示流程。

例如,如图4所示,线程0调度线程1执行tx3(即图7中的txk例如为tx3,其中,k=3)的重做任务。从而,线程1执行步骤s701,确定待重做的tx3。然后,线程1将处理阶段变量t3的值修改为1。之后,线程1执行步骤s703,在共享内存中清空tx3的上次执行的执行信息。在步骤s704,线程1执行tx3,该执行过程可参考上文对步骤s503的描述,在此不再赘述。在步骤s705,线程1读取变量c的值。如图4所示,在tx3重做任务的后半部,tx2提交任务已经完成,因此此时读取的变量c的值为3。因此,线程1执行步骤s706,读取处理阶段变量t3的值。在一种情况中,在tx2提交之后将处理阶段变量t3修改为6,在该情况中,执行步骤s707~s709,以最终提交tx3。在t3不为6的情况中,线程1执行步骤s709,提交tx3。

在另一种实施方式中,线程1在执行步骤s704之后,执行步骤s710,并基于处理阶段变量t3的值执行步骤s711或步骤s712。在进行上述处理之后,线程1成为空闲线程。

图8为与图3中的步骤s306对应的通过工作线程执行交易提交任务的方法流程图。下面将通过实例描述图8所示流程。

例如,如图4所示,假设线程0调度线程1执行对tx1(即,图8中的交易i为tx1,i=1)的提交任务。从而,线程1执行步骤s802,确定待提交的交易1。在步骤s802,线程1将处理阶段变量t1的值修改为3,以指示tx1的处理阶段为提交中阶段。在步骤s806,线程1提交交易1,该过程可参考上文对步骤s508的描述,在此不再赘述。在步骤s808,线程1将处理阶段变量t1的值修改为4,以指示tx1的处理阶段为已提交阶段。在步骤s810,线程1对访问冲突的交易标记重做。图9为步骤s810的执行过程示意图。如图9所示,线程1首先执行步骤s902,确定tx1的访问冲突的交易(例如tx3和tx4)。在步骤s904,线程1读取处理阶段变量t3和处理阶段变量t4的值。参考图4可知,此时处理阶段变量t3的值为2(即,tx3的处理阶段为待提交阶段),处理阶段变量t4的值为1(即tx4的处理阶段为执行中阶段)。从而,针对tx3,线程1将处理阶段变量t3的值修改为5,针对tx4,线程1将处理阶段变量t4的值修改为6,以指示两种重做阶段。之后,线程1执行步骤s812,对变量c的值加1,以指示应提交的交易的编号。

在图8中,步骤s804和步骤s808以虚线示出,表示这两个步骤是可选的。通过步骤s804和步骤s808中的修改,如图1所示,线程0也可以通过各个处理阶段变量的值确定当前应提交的交易,从而,在该情况中,变量c不是必需的。另外,线程0也可以通过各个处理阶段变量的值确定当前待执行的交易,因此,变量e也不是必需的。

另外,在上文的描述中,虽然以第一重做阶段和第二重做阶段来表示两种需要重做的处理阶段,这种表示方法是用于便于线程调用的一种方式,本说明书实施例不限于通过这种方式来表示重做阶段,例如,可将上述两种重做阶段都表示为重做阶段。例如,在上述实例中,线程1可以将处理阶段变量t3和处理阶段变量t4都标记为重做阶段,线程1在读取处理阶段变量t4=1之后,可通知执行tx4的线程终止当前对tx4的执行,以使得tx4等待其它线程重做。

在另一种实施方式中,如图3所示,线程0仅在步骤s308调度空闲线程执行交易重做任务,而不通过步骤s314来调度空闲线程执行交易重做任务。在该情况中,工作线程在获取到交易重做任务之后,可将交易执行过程中记录的读取的变量值与当前读取的变量值进行比较,从而确定该交易是否需要重做,如果比较的结果是相等,则不需要重做。在该情况中,不需要通过交易的处理阶段变量来记录交易的重做阶段。

上文虽然描述了通过调度线程调度工作线程并发执行多个交易的过程,本说明书实施例不限于此。本说明书实施例中可以不使用调度线程,多个工作线程可以自行获取任务。

图10为根据本说明书实施例的通过工作线程并发执行交易的方法流程图。图10所示流程由单个工作线程执行,图10中的方法流程与图3所示调度方法流程基本相同,所不同的是,在步骤s1006、步骤s1008、步骤s1014和步骤s1016,工作线程在确定待执行任务之后,直接执行该任务,而不是调度其它线程来执行该任务,所述对任务的具体执行过程可类似地如图5~图8的方法流程图所示。另外,在步骤s1006、步骤s1008、步骤s1014和步骤s1016中,该工作线程(例如线程1)在确定待执行的任务之后,由于其它线程(例如线程2)也可能并行地确定了该任务并准备执行该任务,因此,线程1需要通过互斥的操作来确定其获取到该任务。在一种实施方式中,图1中的各个处理阶段变量可分别为原子变量,线程1在确定待执行任务之后,通过对相应的原子变量进行原子比较修改操作来获取该任务。可以理解,所述互斥操作不限于为对原子变量的原子操作,例如也可以通过加锁的方式来实现对变量的互斥修改。

例如,当变量c=1时,线程1在步骤s1004确定tx1对应的处理阶段变量t1=2,即,确定tx1提交任务,从而,线程1执行如图8所示的tx1的提交任务。参考图8,在步骤s804,线程1将处理阶段变量t1的值从2原子比较修改为3,如果修改成功,说明在线程1修改之前没有其它线程对处理阶段变量t1进行修改,因此线程1获得执行tx1提交任务,并顺序执行图8所示的后续步骤。如果修改失败,说明在线程1修改之前,已经有其它线程对处理阶段变量t1进行了修改,即,其它线程获得了tx1提交任务,因此,线程1未能获取tx1提交任务。在该情况中,线程1终止对图8中后续步骤的执行,即,终止对tx1提交任务的执行,继续执行图10中的步骤s1010。

例如,当线程1在步骤s1014确定tx3重做任务时,线程1如图7所示执行tx3重做任务。线程1在步骤s702将处理阶段变量t3的值从5原子比较修改为1,如果修改成功,表示线程1获取到该重做任务,并继续执行图7中的后续步骤,如果修改失败,则表示线程1未获取到该重做任务,线程1停止对该tx3重做任务的执行,继续执行图10中的后续的步骤s1016。

例如,当线程2在步骤s1016确定tx5执行任务时,线程2通过图5所示的方法流程来执行该tx5执行任务。线程2在步骤s502将处理阶段变量t5的值从0原子比较修改为1,如果修改成功,表示线程2获取到该tx5执行任务,从而线程2可顺序执行图5中的后续步骤,如果修改失败,表示线程2未获取到该tx5执行任务,线程2停止对tx5执行任务的执行,回到图10中的步骤s1002,重新从步骤s1002开始往下执行。

图11为根据本说明书实施例的本说明书实施例提供一种在区块链中并发执行交易的装置1100,包括:

相对于第一执行体部署的:获取单元111,配置为,获取当前待执行的第一交易;

执行单元112,配置为,执行所述第一交易;

存储单元113,配置为,将所述第一交易的执行信息存储到共享内存中;

记录单元114,配置为,在共享内存中记录所述第一交易的处理阶段为待提交阶段;

相对于第二执行体部署的:第一确定单元115,配置为,确定当前应提交的第一交易;

读取单元116,配置为,如果所述共享内存中记录的所述第一交易的处理阶段为待提交阶段,从共享内存中获取所述第一交易的执行信息;

提交单元117,配置为,提交所述第一交易的执行信息。

在一种实施方式中,所述装置1100还包括相对于第二执行体部署的:第二确定单元118,配置为,在提交所述第一交易的执行信息之后,由第二执行体确定与所述第一交易之间存在变量访问冲突的第二交易;

修改单元119,配置为,对第二交易的处理阶段进行修改,以指示第二交易需要重做。

本说明书另一方面提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行上述任一项方法。

本说明书另一方面提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现上述任一项方法。

通过根据本说明书实施例的并发执行交易的方案,将交易处理过程分为执行过程和提交过程两个过程进行调度,并通过交易的处理阶段变量记录交易的处理阶段以便于任务的调度,线程在执行完交易之后不需要等待前序交易提交之后再提交本交易,而可以结束交易的执行过程并继续处理其它任务,从而充分利用了线程资源,提高了系统性能。

需要理解,本文中的“第一”,“第二”等描述,仅仅为了描述的简单而对相似概念进行区分,并不具有其他限定作用。

本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。

本领域普通技术人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。本领域普通技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。其中,软件模块可以置于随机存储器(ram)、内存、只读存储器(rom)、电可编程rom、电可擦除可编程rom、寄存器、硬盘、可移动磁盘、cd-rom、或技术领域内所公知的任意其它形式的存储介质中。

以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1