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