一种准实时记账方法、装置、存储介质与流程

文档序号:31388809发布日期:2022-09-03 02:00阅读:115来源:国知局
一种准实时记账方法、装置、存储介质与流程

1.本发明涉及一种记账方法,尤其是涉及一种准实时记账方法、装置、存储介质。


背景技术:

2.目前,银行财务系统记录科目账和商户账使用的是数据库表记录期初金额、借方金额、贷方金额和期末金额。每次新增或删除记录时先查询此科目或商户上一条记录的期末余额,然后在此基础上进行新增或删除操作。
3.在高并发的情况下,假设有a和b同时插入一条记录,那么它们同时查询上一条记录c的期末余额(假设为100)。假设b在a后面插入记录,b应该取值a的期末余额,但是现在b的期初金额取的是c的期末余额100,进而记账的连续性正确性被破坏,导致记账错误。目前技术解决方案是在程序查询期末余额时,将表锁住直到业务完成时再释放锁。此种通过锁表操作进行记账的操作可能引发数据库死锁问题,并导致与科目账、商户账相关的功能查询效率大大降低,甚至导致查询超时,严重影响客户体验。


技术实现要素:

4.本发明的目的就是为了克服上述现有技术存在的缺陷而提供一种准实时记账方法,解决高并发场景下的记账错误、重复记账问题,同时避免现有的锁表操作导致数据库死锁问题,提高查询效率。
5.本发明的目的可以通过以下技术方案来实现:
6.一种准实时记账方法,该方法包括:
7.创建临时表;
8.接收记账请求时,启动临时表插入线程;
9.在临时表插入线程中,在创建的临时表中插入需要记账的信息,完成临时表插入后启动记账线程;
10.在记账线程中,采用redis分布式锁进行记账操作锁定与记账操作。
11.优选地,所述的临时表中存储的信息包括科目、商户、金额、借贷方向、公式规则、类型、状态信息。
12.优选地,多条记账请求并发时,分别对应触发一条临时表插入线程,多条临时表插入线程同步运行,每条临时表插入线程完成临时表信息插入后对应启动一条记账线程。
13.优选地,多条记账线程并发时,通过redis分布式锁控制多条记账线程的并发运行。
14.优选地,当多条记账线程并发运行时,redis分布式锁仅锁定其中一条记账线程中的记账操作,基于redis中的记账执行状态字段触发扫描临时表进行记账处理。
15.优选地,记账线程的具体执行过程包括:
16.s1、启动记账线程后,redis分布式锁进行记账操作锁定操作;
17.s2、判断记账操作是否锁定成功,若是执行s3,否则将redis中记账执行状态字段
改为“未执行”,结束当前线程;
18.s3、将redis中记账执行状态字段改为“已执行”;
19.s4、扫描临时表进行记账处理;
20.s5、记账操作完成后,检查redis中记账执行状态字段是否为“已执行”,若是则释放redis分布式锁对记账操作的锁定并结束当前线程,否则循环执行步骤s3~s5。
21.优选地,步骤s4具体包括:扫描临时表,获取临时表中当前需要记账的信息,并修改对应的状态信息,进行记账处理。
22.优选地,当临时表中有多需要记账的信息条目时,同步获取所有记账信息条目,修改所有获取的记账信息条目的状态信息,对记账信息条目逐条进行记账处理。
23.一种准实时记账装置,包括存储器和处理器,所述的存储器用于存储计算机程序,所述的处理器用于当执行所述计算机程序时实现所述的准实时记账方法。
24.一种存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现所述的准实时记账方法。
25.与现有技术相比,本发明具有如下优点:
26.本发明通过临时表插入线程和记账线程两类线程的划分,对记账逻辑进行拆分,优化记账流程,临时表插入线程可并发运行,同时利用redis分布式锁实现数据原子化处理,redis分布式锁锁定记账操作,并非锁定数据库中的记账表,通过本发明的方法一方面解决了高并发场景下的记账错误、重复记账问题,同时避免了现有的锁表操作导致数据库死锁问题,并提高了查询效率。
附图说明
27.图1为本发明一种准实时记账方法的流程框图。
具体实施方式
28.下面结合附图和具体实施例对本发明进行详细说明。注意,以下的实施方式的说明只是实质上的例示,本发明并不意在对其适用物或其用途进行限定,且本发明并不限定于以下的实施方式。
29.实施例1
30.本发明在现有技术方案上对记账方式进行了优化。首先系统新增一张临时表,用于保存科目、商户、金额、借贷方向、公式规则、类型(新增、删除)、状态(初始、正式)信息。然后在新增或删除商户账、科目账时,往临时表中插入相关数据,最后通过多线程触发扫描临时表,并通过redis分布式锁控制程序并发运行,对需要新增或删除的商户账或科目账统一进行记账处理。
31.具体地,如图1所示,本实施例提供一种准实时记账方法,该方法包括:
32.创建临时表;
33.接收记账请求时,启动临时表插入线程;
34.在临时表插入线程中,在创建的临时表中插入需要记账的信息(需要新增或删除的商户账、科目账相关数据),完成临时表插入后启动记账线程;
35.在记账线程中,采用redis分布式锁进行记账操作锁定与记账操作。
36.临时表中存储的信息包括科目、商户、金额、借贷方向、公式规则、类型(新增、删除)、状态信息(初始、正式)。
37.多条记账线程并发时,分别对应触发一条临时表插入线程,多条临时表插入线程同步运行,每条临时表插入线程完成临时表信息插入后对应启动一条记账线程。同时,通过redis分布式锁控制多条记账线程的并发运行。具体地:当多条记账线程并发运行时,redis分布式锁仅锁定其中一条记账线程中的记账操作,基于redis中的记账执行状态字段触发扫描临时表进行记账处理。
38.记账线程的具体执行过程包括:
39.s1、启动记账线程后,redis分布式锁进行记账操作锁定操作;
40.s2、判断记账操作是否锁定成功,若是执行s3,否则说明当前有记账操作正在执行,将redis中记账执行状态字段改为“未执行”,结束当前线程;
41.s3、将redis中记账执行状态字段改为“已执行”;
42.s4、扫描临时表进行记账处理,具体地:
43.扫描临时表,获取临时表中当前需要记账的信息,并修改对应的状态信息(标记为已进行记账处理),进行记账处理,当临时表中有多需要记账的信息条目时,同步获取所有记账信息条目,修改所有获取的记账信息条目的状态信息(标记为已进行记账处理),对记账信息条目逐条进行记账处理,其中,记账处理方式与现有的记账方式一致,首先在数据库中进行查询,此科目或商户上一条记录的期末余额,然后在此基础上进行新增或删除操作;
44.s5、记账操作完成后,检查redis中记账执行状态字段是否为“已执行”,若是则释放redis分布式锁对记账操作的锁定并结束当前线程,否则循环执行步骤s3~s5。
45.一下以一具体实例进行说明:
46.如同时接受到a、b两条记账请求,启动临时表插入线程a和临时表插入线程b,两条临时表插入线程并发运行,在临时表中分别插入对应的需要记账的信息,包括记账信息a和记账信息b,此时两条记账信息的状态均是未完成记账处理,然后完成临时表信息插入后分别启动记账线程a和记账线程b,通过redis分布式锁分配记账操作锁,假设记账线程a完成了当前记账操作的锁定,此时记账线程b将redis中记账执行状态字段改为“未执行”,结束记账线程b,于此同时记账线程a将redis中记账执行状态字段改为“已执行”,记账线程a进行记账操作:首先,扫描临时表,获取临时表中所有未完成记账处理的记账信息条目,包括记账信息a和记账信息b,然后进行记账处理,记账处理方式与现有的记账方式一致,首先在数据库中进行查询,此科目或商户上一条记录的期末余额,然后在此基础上进行新增或删除操作,记账操作完成后,检查redis中记账执行状态字段是否为“已执行”,若是则释放redis分布式锁对记账操作的锁定并结束当前线程,否则,说明临时表中仍有未记账处理的记账信息(如,在上述记账线程a进行记账处理过程中有新的记账请求c,启动临时表插入线程c以及对应的记账线程c,由于此时redis分布式锁仍未释放,则记账线程c无法成功锁定当前线程的记账操作,因此会修改redis中记账执行状态字段是为“未执行”),此时记账线程a需要将redis中记账执行状态字段改为“已执行”,循环进行上述记账操作过程。
47.本发明通过临时表插入线程和记账线程两类线程的划分,对记账逻辑进行拆分,优化记账流程,临时表插入线程可并发运行,同时利用redis分布式锁实现数据原子化处理,redis分布式锁锁定记账操作,并非锁定数据库中的记账表,通过本发明的方法一方面
解决了高并发场景下的记账错误、重复记账问题,同时避免了现有的锁表操作导致数据库死锁问题并提高了查询效率。
48.实施例2
49.本实施例提供一种准实时记账装置,包括存储器和处理器,存储器用于存储计算机程序,处理器用于当执行所述计算机程序时实现实施例1中所述的准实时记账方法,准实时记账方法在实施例1中已经详细说明,本实施例不再赘述。
50.实施例3
51.本实施例提供一种存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现实施例1中所述的准实时记账方法,准实时记账方法在实施例1中已经详细说明,本实施例不再赘述。
52.上述实施方式仅为例举,不表示对本发明范围的限定。这些实施方式还能以其它各种方式来实施,且能在不脱离本发明技术思想的范围内作各种省略、置换、变更。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1