本发明涉及云计算技术领域,具体地,涉及一种数据库事务拆分执行方法及装置。
背景技术:
目前大型银行的业务量随着去ioe、数据库国产化、主机业务下平台的战略布局而逐级增多。虽然能通过分库分表减少压力,但数据库仍然对单个大事务的处理压力非常高。大事务会导致锁定数据太多,产生大量阻塞和锁超时,回滚时间长,主备同步慢,对数据库服务器的io、cpu、内存缓存和主备同步性能造成大压力,甚至会因主库和备库的同步不及时、重新选举主库导致数据库短时间内不可用。
技术实现要素:
本发明实施例的主要目的在于提供一种数据库事务拆分执行方法及装置,以通过拆分的方式对数据库事务进行优化执行,降低数据库的处理压力。
为了实现上述目的,本发明实施例提供一种数据库事务拆分执行方法,包括:
根据数据事务的类型对数据事务进行拆分,得到各子事务;
将各子事务的待修改行的基础版本与对应的数据库当前版本进行比较,根据比较结果对待修改行施加排它锁;
执行各子事务以修改对应的数据库数据,在各子事务均执行成功后释放排它锁。
本发明实施例还提供一种数据库事务拆分执行装置,包括:
拆分模块,用于根据数据事务的类型对数据事务进行拆分,得到各子事务;
排它锁模块,用于将各子事务的待修改行的基础版本与对应的数据库当前版本进行比较,根据比较结果对待修改行施加排它锁;
子事务执行模块,用于执行各子事务以修改对应的数据库数据,在各子事务均执行成功后释放排它锁。
本发明实施例还提供一种计算机设备,包括存储器、处理器及存储在存储器上并在处理器上运行的计算机程序,处理器执行计算机程序时实现所述的数据库事务拆分执行方法的步骤。
本发明实施例还提供一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现所述的数据库事务拆分执行方法的步骤。
本发明实施例的数据库事务拆分执行方法及装置先根据数据事务的类型将数据事务拆分为各子事务,再将各子事务的待修改行的基础版本与对应的数据库当前版本进行比较,根据比较结果对待修改行施加排它锁,最后执行各子事务并在各子事务均执行成功后释放排它锁,可以通过拆分的方式对数据库事务进行优化执行,降低数据库的处理压力。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明一实施例中数据库事务拆分执行方法的流程图;
图2是本发明另一实施例中数据库事务拆分执行方法的流程图;
图3是本发明实施例中表的拆分决策示意图;
图4是本发明实施例中的限流流程图;
图5是数据版本可见性原则示意图;
图6是本发明实施例中执行子事务之前的准备阶段示意图;
图7是本发明实施例中执行子事务的提交阶段示意图;
图8是本发明实施例中回滚阶段的示意图;
图9是本发明实施例中数据库事务拆分执行装置的结构框图;
图10是本发明另一实施例中数据库事务拆分执行装置的结构框图;
图11是本发明实施例中计算机设备的结构框图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本领域技术人员知道,本发明的实施方式可以实现为一种系统、装置、设备、方法或计算机程序产品。因此,本公开可以具体实现为以下形式,即:完全的硬件、完全的软件(包括固件、驻留软件、微代码等),或者硬件和软件结合的形式。
鉴于数据库对单个大事务的处理压力非常高,本发明实施例提供一种数据库事务拆分执行方法,可以通过拆分的方式对数据库事务进行优化执行,降低数据库的处理压力。拆分的子事务在限流的背景下由可以事务管理器协调执行各个子事务,在上述过程中保证每个子事务的提交、回滚、隔离、超时等待以及大事务的隔离性和数据一致性。
图1是本发明一实施例中数据库事务拆分执行方法的流程图。图2是本发明另一实施例中数据库事务拆分执行方法的流程图。如图1和图2所示,数据库事务拆分执行方法包括:
s101:根据数据事务的类型对数据事务进行拆分,得到各子事务。
一实施例中,s101包括:
当数据事务为文件时,根据预设切片行数将所述文件拆分为各子文件,根据各子文件生成各子事务。
结合业界普遍的数据库使用规范,一个事务更改的行数row(dml操作)应当小于10万,因此预设切片行数为10万行,可以通过拆分器将文件按10万行一个子文件进行拆分,根据各子文件生成各导入的子事务,然后与资源管理器交互,请资源管理器提供全局唯一性id(thead_id),记录事务号到子事务对象中,将各子事务存入阻塞缓存队列arrayblockingqueue(限流队列)。
其中,资源管理器通过连接的数据库提供全局唯一性id(当前线程id)。以mysql数据库为例,mysql保存了一个全局变量thread_id_counter,每新建一个连接,就会将thread_id_counter赋值给这个新连接的线程变量。大小为2^32-1,保证了全局唯一性,即使2^32-1写满再循环也不会出现脏读问题,可以由mysql底层实现的唯一数组thread_ids.insert_unique()保证,如下:
new_id=thread_id_counter++;
}while(!thread_ids.insert_unique(new_id).second)。
图3是本发明实施例中表的拆分决策示意图。如图3所示,当数据事务为表时,根据表的元数据将表拆分为各字段区间,根据各字段区间的行数和预设切片行数将各字段区间拆分为各字段,根据各字段生成各子事务。
具体实施时,拆分器内部实现sql语法解析器,解析sql语义并与资源管理器交互,请资源管理器提供表的元数据(包括列名、索引、主键和数据分布情况等)。当对数据事务的dml(datamanipulationlanguage,数据操作语言)操作是update(更新)时,可以通过对外提供的分片策略接口接收传入的分片策略,根据分片策略对表进行拆分。当对数据事务的dml操作是insert(插入)或delete(删除)时,不仅可以通过对外提供的分片策略接口接收传入的分片策略以根据分片策略对表进行拆分,还可以根据表的元数据(例如以主键、唯一索引等)作切片,将表拆分为各字段区间,根据各字段区间的行数和预设切片行数将各字段区间拆分为各字段,即将各字段区间按10万行一个字段进行拆分;最后与资源管理器交互,请资源管理器提供全局唯一性id(thead_id),记录事务号到子事务对象中,将各子事务存入阻塞缓存队列arrayblockingqueue(限流队列)。
本发明通过自动拆分方式对大事务进行优化。大事务(数据事务)分为文件和表:当数据事务为文件时,可以将文件拆分为子文件,然后根据各子文件生成各子事务后导入;当数据事务为表(即大事务为单个无嵌套的sql执行的大事务)时,可以对sql进行语义识别后获取到表的元数据,根据主键、唯一索引和谓词条件等将数据事务拆分成多个子事务。将大事务拆分成多个子事务可以分而治之,从而达到优化大事务的目的,同时还可以提供使用者对事务切片优化的自由,以及对系统可用性和数据一致性取舍的自由。
图4是本发明实施例中的限流流程图。如图4所示,将各子事务存入阻塞缓存队列arrayblockingqueue(限流队列)包括:根据限流器初始化的预设流速(限定的子事务数目)将各子事务存入阻塞缓存队列,用户可自行通过参数来配置限流场景是否需要子事务的分段(segment)数据一致性。
当不要求分段数据一致性且限流队列不为空时,通过事务管理器逐个从限流队列中拿出子事务以执行s102。同时事务管理器会轮询间隔扫描限流队列中的数据是否存在空间,如果限流队列中存在空间,则将子事务放入限流队列中。
当要求分段数据一致性且限流队列不为空时,通过事务管理器将限流队列中的子事务全部拿出以执行s102进行隔离操作,通过s102保证数据事务拆分得到的全部子事务的一致性和隔离性。待上述子事务被执行完毕时,将下一个数据事务拆分得到的全部子事务放入限流队列中,直到全部子事务执行完毕。当预设流速小于其中一个数据事务对应的全部子事务的数量时,为了实现分段数据一致性而不采用限流器。
因此,限流器可通过用户自定义的需求来满足大事务数据的一致性,包括:强一致性(不用限流器的场景),弱一致性(用限流器但是满足分段一致性的场景)和最终一致性(用限流器但是不满足分段一致性的场景)。不仅提供了限流,也兼顾了大事务的数据一致性和隔离性,并且用户可以选择大事务数据一致性的程度。
s102:将各子事务的待修改行的基础版本与对应的数据库当前版本进行比较,根据比较结果对待修改行施加排它锁。
一实施例中,根据比较结果对待修改行施加排它锁包括:
当各子事务的待修改行的基础版本均与对应的数据库当前版本一致时,对待修改行施加排它锁,否则对各子事务进行回滚处理。
图5是数据版本可见性原则示意图。参照图5,不同业务场景的数据库基线的隔离级别不同。当隔离级别为可重复读时,查询只承认在事务启动之前就已经完成提交的数据。以mysql为例,隔离性用mvcc版本号控制实现,每个数据版本都有自己的row_trx_id(基础版本)。因此在事务管理器开始子事务工作之前,通过资源管理器查询各子事务的待修改行的row_trx_id,然后在子事务进行dml操作时候去查看对应的数据库当前版本是否一致,如果不一致,则说明主事务在启动之后有其他已提交的数据发生修改,此时需要回滚数据事务对应的全部子事务,然后再重新发起“查询row_trx_id”的操作。
当隔离级别为读提交时,查询只承认在语句启动前已经提交完成的数据。更新操作(update)是当前读,只会读取已提交完成的最新版本,因此无需额外处理就能做到数据事务的隔离性。
图6是本发明实施例中执行子事务之前的准备阶段示意图。如图6所示,当各子事务的待修改行的基础版本均与对应的数据库当前版本一致时,事务管理器向子事务执行器发送待执行的子事务,询问子事务执行器是否做好提交事务准备。子事务执行器对待修改行施加排它锁后反馈事务管理器。
s103:执行各子事务以修改对应的数据库数据,在各子事务均执行成功后释放排它锁。
图7是本发明实施例中执行子事务的提交阶段示意图。如图7所示,当事务管理器收到全部子事务执行器反馈的执行成功指令(是)时,发出提交指令至子事务执行器,各子事务执行器释放排它锁。当全部排它锁释放成功时,各子事务执行器向事务管理器发送执行成功指令(是)。当事务管理器收到全部子事务执行器返回的执行成功指令时,事务交易闭环并记录日志。
图1所示的数据库事务拆分执行方法的执行主体可以为计算机。由图1所示的流程可知,本发明实施例的数据库事务拆分执行方法先根据数据事务的类型将数据事务拆分为各子事务,再将各子事务的待修改行的基础版本与对应的数据库当前版本进行比较,根据比较结果对待修改行施加排它锁,最后执行各子事务并在各子事务均执行成功后释放排它锁,可以通过拆分的方式对数据库事务进行优化执行,降低数据库的处理压力。
一实施例中,还包括:当其中一个子事务执行失败时,根据失败状态对各子事务进行回滚处理并在回滚处理后释放排它锁。
图8是本发明实施例中回滚阶段的示意图。如图8所示,当其中一个子事务管理器提交失败时,根据状态机反应来确认是否需要重试。如果状态机反应为权限不够或存在明确的数据报错问题时,不需要重试以避免浪费开销。如果状态机反应网络连接超时则设置合理重试次数,重试该子事务。如果仍然重试失败,则事务管理器返回no(否),对数据事务对应的全部子事务发起回滚(rollback)操作。当回滚时有子事务执行器返回false(错误),则停止重试,记录大事务状态为异常状态并记录现场,停止大事务,事务交易闭环。
综上,为了解决单机大事务造成数据库处理瓶颈的问题,本发明提供了一种数据库事务拆分执行方法,可以敏捷而有效地将大事务(数据事务)切分为多个子事务,利用数据库线程id保证了事务全局唯一性,巧妙利用版本控制方法实现数据隔离性,最后通过限流器实现一致性并完成限流和降级,具有以下有益效果:
1、完整保障了大事务的事务特性,创造性结合子事务的协调,实现了大事务的数据一致性和隔离性。
2、轻量而敏捷地实现大事务的拆分。
3、提供了切片主动式策略,存在事务切片效率优化的空间。
4、提供了限流器及其联动操作,兼顾了大事务的数据一致性和隔离性,使用者可以自行决定大事务数据的一致性,也可以通过限流队列的接口来调节对系统可用性以及数据一致性的自由取舍。
基于同一发明构思,本发明实施例还提供了一种数据库事务拆分执行装置,由于该装置解决问题的原理与数据库事务拆分执行方法相似,因此该装置的实施可以参见方法的实施,重复之处不再赘述。
图9是本发明实施例中数据库事务拆分执行装置的结构框图。图10是本发明另一实施例中数据库事务拆分执行装置的结构框图。如图9-图10所示,数据库事务拆分执行装置包括:
拆分模块,用于根据数据事务的类型对数据事务进行拆分,得到各子事务;
排它锁模块,用于将各子事务的待修改行的基础版本与对应的数据库当前版本进行比较,根据比较结果对待修改行施加排它锁;
子事务执行模块,用于执行各子事务以修改对应的数据库数据,在各子事务均执行成功后释放排它锁。
在其中一种实施例中,拆分模块包括:
文件拆分模块,用于当数据事务为文件时,根据预设切片行数将所述文件拆分为各子文件,根据各子文件生成各子事务;
表拆分模块,用于当数据事务为表时,根据表的元数据将所述表拆分为各字段区间,根据各字段区间的行数和预设切片行数将各字段区间拆分为各字段,根据各字段生成各子事务。
在其中一种实施例中,排它锁模块具体用于:
当各子事务的待修改行的基础版本均与对应的数据库当前版本一致时,对待修改行施加排它锁,否则对各子事务进行回滚处理。
在其中一种实施例中,还包括:
回滚模块,用于当其中一个子事务执行失败时,根据失败状态对各子事务进行回滚处理并在回滚处理后释放排它锁。
如图10所示,在实际应用中,数据库事务拆分执行装置包括:拆分器、资源管理器、事务管理器和多个子事务执行器;事务管理器包括子事务限流器。
拆分器包括拆分模块,用于识别数据事务,拆分子事务,给子事务分配全局唯一性id。将大事务拆分成多个子事务需要满足以下特点:大事务是能拆的、子事务能满足事务的基本特性、拆分必须紧扣数据库开发规范。
资源管理器用于对数据库连接池实现代理,获取数据库的元数据、表的元数据、子事务全局唯一性id、提供数据库连接服务。
事务管理器包括排它锁模块和回滚模块,负责子事务的全局管理,包括子事务的生命周期管理和资源的分配协调等。
限流器提供了供使用者自行实现限流队列的接口,满足使用者对数据一致性或系统可用性进行灵活取舍的自由。用户可在不需要数据强一致性的场景下使用来减轻系统压力,并将数据一致性从强一致性降级为最终一致性。限流器的目的一方面是为了保证大事务构件在某个速度下的响应时间以及可用性,另一方面是为了削峰减轻整个系统的压力。因此在大事务构件的分布式场景中,如果需要用到限流器则需要牺牲数据一致性,从强一致性降级为最终一致性,牺牲的程度可让用户自行实现限流队列的接口来定义。
限流器和事务管理器是耦合的,事务管理器依赖限流器。事务管理器根据限流器配置的流速策略来实现多个子事务同时进行。限流器提供参数配置来区分限流场景是否需要子事务的分段(segment)数据一致性,具体流程如下:
1、限流器初始化,并且将流速(限定的子事务数目)告知事务管理器。
2、事务管理器根据流速来实现多个子事务同时进行事务操作,将子事务写入到限流器的限流队列中。
3、事务管理器读取限流队列的子事务,进行子事务的事务操作,用户可自行通过参数配置来区分限流场景是否需要子事务的分段(segment)数据一致性。
子事务执行器包括子事务执行模块,负责对子事务的任务执行,实现预提交、提交和回滚功能。
综上,本发明实施例的数据库事务拆分执行装置先根据数据事务的类型将数据事务拆分为各子事务,再将各子事务的待修改行的基础版本与对应的数据库当前版本进行比较,根据比较结果对待修改行施加排它锁,最后执行各子事务并在各子事务均执行成功后释放排它锁,可以通过拆分的方式对数据库事务进行优化执行,降低数据库的处理压力。
本发明实施例还提供能够实现上述实施例中的数据库事务拆分执行方法中全部步骤的一种计算机设备的具体实施方式。图11是本发明实施例中计算机设备的结构框图,参见图11,所述计算机设备具体包括如下内容:
处理器(processor)1101和存储器(memory)1102。
所述处理器1101用于调用所述存储器1102中的计算机程序,所述处理器执行所述计算机程序时实现上述实施例中的数据库事务拆分执行方法中的全部步骤,例如,所述处理器执行所述计算机程序时实现下述步骤:
根据数据事务的类型对数据事务进行拆分,得到各子事务;
将各子事务的待修改行的基础版本与对应的数据库当前版本进行比较,根据比较结果对待修改行施加排它锁;
执行各子事务以修改对应的数据库数据,在各子事务均执行成功后释放排它锁。
综上,本发明实施例的计算机设备先根据数据事务的类型将数据事务拆分为各子事务,再将各子事务的待修改行的基础版本与对应的数据库当前版本进行比较,根据比较结果对待修改行施加排它锁,最后执行各子事务并在各子事务均执行成功后释放排它锁,可以通过拆分的方式对数据库事务进行优化执行,降低数据库的处理压力。
本发明实施例还提供能够实现上述实施例中的数据库事务拆分执行方法中全部步骤的一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述实施例中的数据库事务拆分执行方法的全部步骤,例如,所述处理器执行所述计算机程序时实现下述步骤:
根据数据事务的类型对数据事务进行拆分,得到各子事务;
将各子事务的待修改行的基础版本与对应的数据库当前版本进行比较,根据比较结果对待修改行施加排它锁;
执行各子事务以修改对应的数据库数据,在各子事务均执行成功后释放排它锁。
综上,本发明实施例的计算机可读存储介质先根据数据事务的类型将数据事务拆分为各子事务,再将各子事务的待修改行的基础版本与对应的数据库当前版本进行比较,根据比较结果对待修改行施加排它锁,最后执行各子事务并在各子事务均执行成功后释放排它锁,可以通过拆分的方式对数据库事务进行优化执行,降低数据库的处理压力。
以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
本领域技术人员还可以了解到本发明实施例列出的各种说明性逻辑块(illustrativelogicalblock),单元,和步骤可以通过电子硬件、电脑软件,或两者的结合进行实现。为清楚展示硬件和软件的可替换性(interchangeability),上述的各种说明性部件(illustrativecomponents),单元和步骤已经通用地描述了它们的功能。这样的功能是通过硬件还是软件来实现取决于特定的应用和系统的设计要求。本领域技术人员可以对于每种特定的应用,可以使用各种方法实现所述的功能,但这种实现不应被理解为超出本发明实施例保护的范围。
本发明实施例中所描述的各种说明性的逻辑块,或单元,或装置都可以通过通用处理器,数字信号处理器,专用集成电路(asic),现场可编程门阵列或其它可编程逻辑装置,离散门或晶体管逻辑,离散硬件部件,或上述任何组合的设计来实现或操作所描述的功能。通用处理器可以为微处理器,可选地,该通用处理器也可以为任何传统的处理器、控制器、微控制器或状态机。处理器也可以通过计算装置的组合来实现,例如数字信号处理器和微处理器,多个微处理器,一个或多个微处理器联合一个数字信号处理器核,或任何其它类似的配置来实现。
本发明实施例中所描述的方法或算法的步骤可以直接嵌入硬件、处理器执行的软件模块、或者这两者的结合。软件模块可以存储于ram存储器、闪存、rom存储器、eprom存储器、eeprom存储器、寄存器、硬盘、可移动磁盘、cd-rom或本领域中其它任意形式的存储媒介中。示例性地,存储媒介可以与处理器连接,以使得处理器可以从存储媒介中读取信息,并可以向存储媒介存写信息。可选地,存储媒介还可以集成到处理器中。处理器和存储媒介可以设置于asic中,asic可以设置于用户终端中。可选地,处理器和存储媒介也可以设置于用户终端中的不同的部件中。
在一个或多个示例性的设计中,本发明实施例所描述的上述功能可以在硬件、软件、固件或这三者的任意组合来实现。如果在软件中实现,这些功能可以存储与电脑可读的媒介上,或以一个或多个指令或代码形式传输于电脑可读的媒介上。电脑可读媒介包括电脑存储媒介和便于使得让电脑程序从一个地方转移到其它地方的通信媒介。存储媒介可以是任何通用或特殊电脑可以接入访问的可用媒体。例如,这样的电脑可读媒体可以包括但不限于ram、rom、eeprom、cd-rom或其它光盘存储、磁盘存储或其它磁性存储装置,或其它任何可以用于承载或存储以指令或数据结构和其它可被通用或特殊电脑、或通用或特殊处理器读取形式的程序代码的媒介。此外,任何连接都可以被适当地定义为电脑可读媒介,例如,如果软件是从一个网站站点、服务器或其它远程资源通过一个同轴电缆、光纤电缆、双绞线、数字用户线(dsl)或以例如红外、无线和微波等无线方式传输的也被包含在所定义的电脑可读媒介中。所述的碟片(disk)和磁盘(disc)包括压缩磁盘、镭射盘、光盘、dvd、软盘和蓝光光盘,磁盘通常以磁性复制数据,而碟片通常以激光进行光学复制数据。上述的组合也可以包含在电脑可读媒介中。