数据库操作方法及装置【技术领域】
本申请涉及数据库技术领域,尤其涉及一种数据库操作方法及装置。
【背景技术】
数据库事务(Database Transaction),是指作为单个逻辑工作单元执行
的一系列操作,要么完全地执行,要么完全地不执行。一个事务由一系列数
据库操作指令构成,例如结构化查询语言(Structured Query Language,SQL)
语句,这些数据库操作指令之间存在切分条件以及跳转等逻辑,意味着在一
次执行过程中该事务中可能有部分数据库操作指令被跳过不执行。但在现有
技术中,由于无法预先获知事务中需要执行的数据库操作指令,因此只能按
照执行逻辑边执行边判断,依次执行事务中的语句,以实现对数据库的操作。
这种事务执行方式效率较低,事务吞吐量较低。
【发明内容】
本申请的多个方面提供一种数据库操作方法及装置,用以提高事务执行
效率并增大事务吞吐量。
本申请的一方面,提供一种数据库操作方法,包括:
在应用服务器执行目标事务的过程中,依次获取所述应用服务器执行到
的所述目标事务中的数据库操作指令;
对所述数据库操作指令进行预测执行,将预测执行结果返回给所述应用
服务器以供所述应用服务器确定下一个需要执行的数据库操作指令,并在本
地记录所述数据库操作指令以及所述预测执行产生的预测执行数据;
当获取到所述目标事务中的事务提交指令时,根据本地记录的所述数据
库操作指令以及所述预测执行数据,控制所述应用服务器对应的数据库实际
执行所述目标事务。
本申请的另一方面,提供一种数据库操作装置,包括:
获取模块,用于在应用服务器执行目标事务的过程中,依次获取所述应
用服务器执行到的所述目标事务中的数据库操作指令;
预测执行模块,用于对所述数据库操作指令进行预测执行,将预测执行
结果返回给所述应用服务器以供所述应用服务器确定下一个需要执行的数据
库操作指令,并在本地记录所述数据库操作指令以及所述预测执行产生的预
测执行数据;
控制执行模块,用于当获取到所述目标事务中的事务提交指令时,根据
本地记录的所述数据库操作指令以及所述预测执行数据,控制所述应用服务
器对应的数据库实际执行所述目标事务。
在本申请中,数据库操作装置与应用服务器相互配合,在应用服务器执
行目标事务的过程加入预测执行过程,预先获得并记录目标事务需要执行的
全部数据库操作指令以及预测执行数据,为真实执行事务提供了条件,之后
根据记录的数据库操作指令以及预测执行数据,控制应用服务器对应的数据
库实际执行该目标事务,有利于提高执行效率,进而增大事务吞吐量。
【附图说明】
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例或现有
技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的
附图是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造
性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为现有技术中数据库应用系统的部署图;
图2为本申请一实施例提供的数据库应用系统的部署图;
图3为本申请一实施例提供的数据库操作方法的流程示意图;
图4为本申请一实施例提供的数据库操作装置的结构示意图。
【具体实施方式】
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申
请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,
显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于
本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获
得的所有其他实施例,都属于本申请保护的范围。
图1为现有技术中数据库应用系统的部署图。如图1所示,该系统包括:
应用服务器10和数据库20。其中,数据库20可以为一个,也可以为多个。
图1中仅示例性的示出一个数据库20。当需要以事务方式对数据库20进行
访问时,应用服务器10执行事务逻辑,依次将事务中的数据库操作指令作
用于数据库20上。这种事务执行方式的效率较低,事务吞吐量较低。
针对现有技术存在的缺陷,本申请提供一种新的数据库应用系统,如图
2所示。该系统在应用服务器10和数据库20之间增加数据库操作装置30。
数据库操作装置30用以执行本申请提供的数据库操作方法,实现一种新的
事务执行逻辑,即先对事务进行预测执行,提前获得该事务中需要执行的数
据库操作指令,实现执行路径的预测,进而基于预测执行得到的数据库操作
指令和预测执行数据在数据库20上实际执行事务,有利于提高事务执行效
率,增大事务吞吐量。事务吞吐量是指单位时间内处理事务的数量。
值得说明的是,数据库操作装置30实际上是一种逻辑处理装置,其可
以单独部署,位于应用服务器10和数据库20之间,也可以部署于应用服务
器10一端实现,或者也可以部署于数据库20一端实现。
下面实施例将具体说明本申请技术方案的方法流程。
图3为本申请一实施例提供的数据库操作方法的流程示意图。如图3所
示,该方法包括:
301、在应用服务器执行目标事务的过程中,依次获取应用服务器执行到的
目标事务中的数据库操作指令。
302、对数据库操作指令进行预测执行,将预测执行结果返回给应用服务器
以供应用服务器确定下一个需要执行的数据库操作指令,并在本地记录数据库
操作指令以及预测执行产生的预测执行数据。
303、当获取到目标事务中的事务提交指令时,根据本地记录的数据库
操作指令以及预测执行数据,控制应用服务器对应的数据库实际执行目标事
务。
首先说明,为便于描述,本实施例将应用服务器需要执行的事务称为目
标事务。目标事务主要包括用于对数据库进行操作的操作指令,除数据库操
作指令之外还包括一些用于控制目标事务执行状态的控制指令,例如事务开
始指令、事务提交指令、事务回滚指令等。这些指令实际上是由数据库语言
编写的语句。根据数据库语言的不同,这些指令可以是不同语言编写的语句。
举例说明,若采用SQL,则上述数据库操作指令和控制指令实际上是一系列
的SQL语句。
具体的,应用服务器控制整个目标事务的执行逻辑,可以按照现有方式
执行目标事务。数据库操作装置在应用服务器执行目标事务的过程中,依次
获取应用服务器执行到的目标事务中的数据库操作指令。
在一可选实施方式中,应用服务器按照现有方式向数据库发送数据库操
作指令,以实现对数据库的访问。数据库操作装置可以对应用服务器与数据
库之间的通信进行监控,以拦截应用服务器发往数据库的数据库操作指令。
在另一可选实施方式中,对应用服务器的处理逻辑进行稍微修改,将原
来向数据库发送数据库操作指令的逻辑改为向数据库操作装置发送。基于此,
数据库操作装置可以接收应用服务器主动下发的数据库操作指令。
在此说明,若目标事务是显式事务,则目标事务中的首个指令是事务开
始指令,如开始事务(begin transaction),基于此,数据库操作装置在获取应
用服务器执行到的数据库操作指令之前,可以拦截应用服务器发往数据库的
目标事务中的事务开始指令,根据该事务开始指令,获知需要执行目标事务。
或者,数据库操作装置在获取应用服务器执行到的数据库操作指令之前,可
以接收应用服务器主动下发的目标事务中的事务开始指令,根据该事务开始
指令,获知需要执行目标事务。若目标事务是隐式事务,则目标事务的首个
指令就是数据库操作指令,不包括获取事务开始指令的步骤。
数据库操作装置在获取应用服务器执行到的数据库操作指令后,对获取
到的数据库操作指令进行预测执行,将预测执行结果返回给应用服务器,以供
应用服务器确定下一个需要执行的数据库操作指令。其中,预测执行结果决定
着目标事务的执行路径,这里的执行路径是指数据库操作指令之间的跳转逻辑。
通过将预测执行结果返回给应用服务器,从而达到由应用服务器控制整个目标
事务的执行逻辑的目的。
另外,数据库操作装置还需要在本地记录所获取到的数据库操作指令,以
及记录对该数据库操作指令进行预测执行产生的预测执行数据。所述预测执行
数据主要是指对数据库操作指令进行预测执行过程中的一些数据。
例如,数据库操作装置可以在本地创建内存库,将所获取到的数据库操作
指令以及预测执行数据存入内存库中。
其中,数据库操作指令对数据库的操作主要是访问数据库中的数据,则
可以模拟数据库操作指令的数据环境,基于所模拟的数据环境对数据库操作指
令进行预测执行。基于此,一种对数据库操作指令进行预测执行的方式可以是:
在本地创建的内存库中模拟数据库操作指令所需的数据环境,基于所模拟的
数据环境对数据库操作指令进行预测执行。
进一步,一种在本地创建的内存库中模拟数据库操作指令的数据环境,基
于所模拟的数据环境对数据库操作指令进行预测执行的实施方式包括:
将获取到的数据库操作指令拆分为一个读指令和一个写指令,将读指令
运行于真正的数据库上,即在数据库中执行该读指令以获取读数据集
(ReadSet),将读数据集存入本地内存库中,以模拟数据库操作指令所需的
数据环境。然后,将写指令作用于内存库上,以实现对数据库操作指令的预
测执行,即在内存库中执行写指令以修改读数据集,例如对读数据集中的有
关数据进行更新或查询处理等。其中,执行写指令以修改读数据集可以产生
结果数据集(affectRowInMemdb),该结果数据集包括预测执行结果。
在上述预测执行过程中,数据库操作装置可以在本地记录读指令所读取的
读数据集以及执行写指令产生的结果数据集。由此可见,所述预测执行数据可
以包括读数据集和结果数据集,或者也可以包括读数据集和结果数据集中的部
分数据,例如能够对在数据库中实际执行目标事务产生有益效果的一些数据,
例如一些数值的各种索引,例如一级索引、二级索引、主键值等。
数据库操作装置对依次获取到的数据库操作指令分别执行上述预测操
作,获得各数据库操作指令及其对应的预测执行数据存储到内存库中。
当数据库操作装置获取到目标事务中的事务提交指令(即应用服务器执
行到事务提交指令)时,则可以根据本地记录的数据库操作指令以及预测执
行数据,控制应用服务器对应的数据库实际执行目标事务。
由上述可见,数据库操作装置与应用服务器相互配合,在应用服务器执
行目标事务的过程加入预测执行过程,预先获得并记录目标事务需要执行的
全部数据库操作指令以及预测执行数据,为真实执行事务提供了条件,之后
在根据记录的数据库操作指令以及预测执行数据实际执行该目标事务时,可
以提前获取有关数据信息并且可以减少指令之间的跳转等,有利于提高执行
效率,增大事务吞吐量。
上述根据本地记录的数据库操作指令以及预测执行数据,控制应用服务
器对应的数据库实际执行目标事务的一种可选实施方式包括:
数据库操作装置向数据库下发本地记录的数据库操作指令,以指示数据
库执行本地记录的所述数据库操作指令,并接收数据库返回的数据库操作指
令的实际执行结果;然后,将数据库操作指令的实际执行结果与预测执行结
果进行比较,若实际执行结果与预测执行结果相同,向数据库下发事务提交
指令,以供数据库提交目标事务;若实际执行结果与预测执行结果不相同,
向数据库下发事务回滚指令,以供数据库回滚目标事务。
在上述实施方式中,考虑到事务的原子性,通过将实际执行结果与预测
执行结果进行比较,可以避免事务执行过程出错,有利于提高事务执行的成
功概率。
进一步,在现有技术中,由于无法预先知道事务需要执行的全部数据库
操作指令,所以只能按照事务的执行逻辑依次执行数据库操作指令,这会导
致应用服务器与数据库之间的频繁交互,这在远程应用场景中将会消耗大量
网络资源。但在本实施例中,通过预测执行过程已经预先获得目标事务需要
执行的全部数据库操作指令,即本地记录的数据库操作指令,因此在向数据
库下发本地记录的数据库操作指令,以指示数据库执行本地记录的所述数据
库操作指令的过程中,可以将本地记录的数据库操作指令同时(或者一并)
下发到数据库,有利于节约网络资源。另外,对于一些并行的数据库操作指
令,数据库还可以并行操作,有利于进一步提高事务执行效率。
进一步,还可以将本地记录的所有数据库操作指令连同本地记录的预测执
行数据一并下发给数据库。
进一步,在一种根据内存库中存储的数据库操作指令以及预测执行数
据,控制应用服务器对应的数据库实际执行目标事务的可选实施方式中,数
据库操作装置可以根据本地记录的数据库操作指令,判断目标事务是否为单
机事务;若判断结果为是,则根据本地记录的所述数据库操作指令以及预测
执行数据,以单机事务处理逻辑控制数据库实际执行目标事务;若判断结果
为否,则根据本地记录的数据库操作指令以及预测执行数据,以分布式事务
处理逻辑控制数据库实际执行目标事务。
其中,基于预测执行过程中获得的数据库操作指令可以识别出目标事务是
单机事务还是分布式事务。例如,可以判断本地记录的数据库操作指令的操作
对象是否作用于同一物理设备上,若判断结果为是,则可以确定该目标事务为
单机事务;若判断结果为否,则可以确定该目标事务为分布式事务。
由于分布式事务的处理逻辑和单机事务的处理逻辑有所不同,单机事务
的处理逻辑相对简单,例如不涉及读写加锁等问题,所以所消耗的资源也相
对较少。基于此,本实施例通过识别目标事务是否为单机事务,在识别为单
机事务时采用单机事务的处理逻辑进行处理,有利于提高处理效率,节约处
理成本。
在一可选实施方式中,若数据库操作装置获取到目标事务中的事务回滚
指令(即应用服务器执行到事务回滚指令)时,可以直接清空本地内存库,
实现回滚操作。在该情况下,由于目标事务并未在数据库中真正执行,所以
数据库无需执行回滚操作,可见,在这种情况下,采用本实施例方法也可以
提高事务执行效率。
下面以减库存事务为例,详细说明本申请技术方案的工作流程。
减库存事务的SQL代码如下,括号内的文字为注释:
begin transaction(开始事务)
select*from inventory where itemId=?for update(用商品id查看当
前库存,并锁定)
if(item.inventory>0)
item.inventory--;
update inventory set item.inventory=$item.inventory where itemId
=?
commit;
else
rollback;(如果当前库存大于0,则减少、更新商品库存并提交,否则
回滚)
在实际执行过程中,应用服务器负责该减库存事务的整个逻辑,数据库
操作装置(或者也可称为执行服务器)只会获取应用服务器执行到的开始事
务,需要执行的SQL语句,以及提交/回滚指令。
首先,开始事务后,数据库操作装置在本地创建内存库;
当数据库操作装置获取到select*from inventory where itemId=?for
update这条SQL语句时,将这条SQL语句直接在数据库中进行查找,并
在本地内存库中记录下这次查询结果(即查询到的待处理数据,也就是当前
库存量),并将全部查询结果返回给应用服务器。
值得说明的是,由于该SQL语句是一条查询语句,所以对该语句进行
拆分与否其结果都相同,为了简化操作可以不对查询语句进行拆分。
应用服务器收到数据库操作装置返回的查询结果后,判断查询结果是否
大于0,若判断结果为是,则将当前库存量减少,并执行更新语句,即update
inventory set item.inventory=$item.inventory where itemId=?;若判断结
果为否,则执行回滚语句。
若数据库操作装置收到了rollback语句,则清空本地内存库。在这种情
况下,因为事务并没有在数据库中执行,所以无需数据库执行回滚操作。
若数据库操作装置收到了更新语句,即update inventory set
item.inventory=?where itemId=?,则将这条SQL语句拆解为一个读数据
库指令,即select*from inventory where itemId=?和一个写数据库指令,
即update inventory set item.inventory=?where itemId=?;接着,将select
*from inventory where itemId=?这个语句下发到数据库中,获得读数据集,
将读数据集中的数据写入本地内存库中;再根据update inventory set
item.inventory=?where itemId=?这个语句在本地内存库中进行更新操作,
以获得结果数据集,并将结果数据集中的执行结果返回给应用服务器。应用
服务器此时执行commit指令。其中,结果数据集和读数据集中的数据构成
预测执行数据。
当数据库操作装置获取到commit指令后,基于内存库中存储的SQL语
句以及预测执行数据,在数据库中执行该减库存事务,这次事务执行过程是
真实执行的。
优选的,数据库操作装置可以一次性将本地内存库中的SQL语句全部
提交到数据库中,数据库基于此进行执行,有利于节约传输SQL语句所消耗
的网络资源。
这次真实执行也会返回执行结果,可以将预测执行结果与实际执行结果
进行比较,如果比较结果为相同,则可以在数据库中提交这次事务,而如果
比较结果为不相同,则认为提交是失败的,由于在这种情况下,事务本身其
实一直都没有真正的在数据库中执行提交,所以可以简单地回滚整个请求,
让应用服务器重新提交即可。
其中,经过上述预测执行,已经获得了所有的需要执行的SQL语句,
以及他们对应的预测执行数据,例如全部切分条件,数值的索引等,而这些
数据足以让我们提前对事务是否是单机事务做出判断。基于此,可以采用相
应的事务处理逻辑进行处理,有利于节约资源。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表
述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描
述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同
时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属
于优选实施例,所涉及的动作和模块并不一定是本申请所必须的。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有
详述的部分,可以参见其他实施例的相关描述。
图4为本申请一实施例提供的数据库操作装置的结构示意图。如图4所
示,该装置包括:获取模块41、预测执行模块42和控制执行模块43。
获取模块41,用于在应用服务器执行目标事务的过程中,依次获取应用
服务器执行到的目标事务中的数据库操作指令。
预测执行模块42,用于对数据库操作指令进行预测执行,将预测执行结
果返回给应用服务器以供应用服务器确定下一个需要执行的数据库操作指
令,并在本地记录数据库操作指令以及预测执行产生的预测执行数据。
控制执行模块43,用于当获取到目标事务中的事务提交指令时,根据内
存库中存储的数据库操作指令以及预测执行数据,控制应用服务器对应的数
据库实际执行目标事务。
在一可选实施方式中,获取模块41具体可用于:拦截应用服务器发往
数据库的数据库操作指令;或者,接收应用服务器主动下发的数据库操作指
令。
在一可选实施方式中,获取模块41还用于:在获取应用服务器执行到
的目标事务中的数据库操作指令之前,拦截应用服务器发往数据库的目标事
务中的事务开始指令;或者,接收应用服务器主动下发的目标事务中的事务
开始指令。
在一可选实施方式中,预测执行模块42具体用于:
在本地创建的内存库中模拟数据库操作指令所需的数据环境,基于模拟
的数据环境对数据库操作指令进行预测执行。
进一步,预测执行模块42具体用于:
将数据库操作指令拆分为读指令和写指令;
在数据库中执行读指令以获取读数据集,将读数据集存入内存库中以模
拟数据库操作指令的数据环境;
在内存库中执行写指令以修改读数据集。
在一可选实施方式中,控制执行模块43具体用于:
向数据库下发本地记录的数据库操作指令,以指示数据库执行本地记录
的数据库操作指令,并接收数据库返回的数据库操作指令的实际执行结果;
若实际执行结果与预测执行结果相同,向数据库下发事务提交指令,以
供数据库提交目标事务;
若实际执行结果与预测执行结果不相同,向数据库下发事务回滚指令,
以供数据库回滚目标事务。
考虑到事务的原子性,控制执行模块43通过将实际执行结果与预测执
行结果进行比较,可以避免事务执行过程出错,有利于提高事务执行的成功
概率。
进一步,控制执行模块43具体用于:在向数据库下发本地记录的数据库操作指令,
以指示数据库执行本地记录的数据库操作指令的过程中,将本地记录的数据库操作
指令同时下发给数据库,有利于节约网络资源。
在一可选实施方式中,控制执行模块43具体用于:
根据本地记录的数据库操作指令,判断目标事务是否为单机事务;
若判断结果为是,则根据本地记录的数据库操作指令以及预测执行数
据,以单机事务处理逻辑控制数据库实际执行目标事务;
若判断结果为否,则根据本地记录的数据库操作指令以及预测执行数
据,以分布式事务处理逻辑控制数据库实际执行目标事务。
由于分布式事务的处理逻辑和单机事务的处理逻辑有所不同,单机事务
的处理逻辑相对简单,例如不涉及读写加锁等问题,所以所消耗的资源也相
对较少。基于此,控制执行模块43通过识别目标事务是否为单机事务,在
识别为单机事务时采用单机事务的处理逻辑进行处理,有利于提高处理效率,
节约处理成本。
在一可选实施方式中,预测执行模块42还用于:在获取到目标事务中
的事务回滚指令时,删除本地记录的数据库操作指令以及预测执行数据,例
如清空内存库。
本实施例提供的数据库操作装置,其可以单独部署,位于应用服务器和
数据库之间,也可以部署于应用服务器一端实现,或者也可以部署于数据库
一端实现。
本实施例提供的数据库操作装置,与应用服务器相互配合,在应用服务
器执行目标事务的过程加入预测执行过程,在预测执行过程中,可以提前获
得目标事务的执行路径,即真正需要执行的数据库操作指令,并记录预测执
行产生的预测执行数据,为真实执行事务提供了条件,之后在根据记录的数
据库操作指令以及预测执行数据实际执行该目标事务时,例如基于预测执行
数据可以提前获取有关数据信息并且可以减少指令之间的跳转等,因此可以
提高执行效率,增大事务吞吐量。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描
述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应
过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和
方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示
意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可
以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个
系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间
的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合
或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作
为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,
或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或
者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元
中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一
个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加
软件功能单元的形式实现。
上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机
可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指
令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)
或处理器(processor)执行本申请各个实施例所述方法的部分步骤。而前述
的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、
随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种
可以存储程序代码的介质。
最后应说明的是:以上实施例仅用以说明本申请的技术方案,而非对其
限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术
人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或
者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技
术方案的本质脱离本申请各实施例技术方案的精神和范围。