本发明涉及一种基于事务表处理es与mysql分布式事务问题的方法,属于分布式事务问题处理。
背景技术:
1、现有的对于分布式事务问题的解决方案只能被应用于不同mysql数据库中,例如专利号为:cn202010947573.0的一种分布式事务处理方法装置及系统,通过tm事务管理器控制mysql分片数据库中客户端能够查询的分布式事务的版本号,tm事务管理器接收mysql分片数据库发送的分布式事务的子事务的版本号,并在接收到预设的触发指令的情况下,将已完成的分布式事务的各个子事务的版本号发送给预设的缓存数据库,以供缓存数据库更新版本号。当接收到客户端发送的查询指令的情况下,tm事务管理器将查询指令和缓存数据库中的查询指令指向的目标版本号发送给mysql分片数据库,这样可以使得mysql分片数据库反馈的分布式事务的子事务的执行结果不超过目标版本号指示的范围,保障了分布式事务的隔离性。目前,针对elasticsearch(简称为es)与mysql分布式事务问题没有一个较好的解决方案,现有技术必须要求开发者手动书写补偿方案。
技术实现思路
1、本发明所要解决的技术问题是:提供一种基于事务表处理es与mysql分布式事务问题的方法,克服了现有技术的不足。
2、本发明为解决上述技术问题采用以下技术方案:
3、一种基于事务表处理es与mysql分布式事务问题的方法,包括如下步骤:
4、步骤1,创建本次事务唯一id;
5、步骤2,查询需要进行elasticsearch操作的es数据的索引名、文档id和改变的字段,将需要进行elasticsearch操作的es数据的前像转为json格式;
6、步骤3,将进行elasticsearch操作后得到的数据记为后像,同时将后像转为json格式,将索引名、文档id、改变的字段、前像json格式和后像json格式作为es事务表的一条记录,插入数据库中;
7、步骤4,若插入失败,则将本次事务进行回滚,若插入成功,则进行elasticsearch操作;
8、步骤5,若elasticsearch操作失败,则将本次事务进行回滚,若elasticsearch操作成功,则进入步骤6;
9、步骤6,查询需要进行mysql操作的mysql数据的表名、主键名和主键值,将需要进行mysql操作的mysql数据的前像转为json格式;
10、步骤7,将进行mysql操作后得到的数据记为后像,同时将后像转为json格式,将表名、主键名、主键值、前像json格式和后像json格式作为mysql事务表的一条记录,插入数据库中;
11、步骤8,若插入失败,则将本次事务进行回滚,若插入成功,则进行mysql操作;
12、步骤9,若mysql操作失败,则将本次事务进行回滚,若mysql操作成功,则删除es事务表与mysql事务表中与本次事务有关的记录。
13、作为本发明的一种优选方案,所述回滚的具体步骤如下:
14、步骤a,查询步骤1创建的本次事务id的所有es事务数据,按步骤c-步骤g对所有es事务数据进行遍历;
15、步骤b,判断遍历是否结束,若结束则进入步骤h,否则进入步骤c;
16、步骤c,根据步骤2查询到的索引名、文档id和改变的字段,得到当前es数据;
17、步骤d,判断当前遍历的es事务数据中是否存在后像数据;若不存在后像数据,则判断当前es数据是否存在;若当前es数据不存在,则创建与当前遍历的es事务数据中的前像相同的文档,并删除当前遍历的es事务数据,返回步骤b;若当前es数据存在,则删除当前遍历的es事务数据,返回步骤b;若存在后像数据,则判断当前es数据是否存在;
18、步骤e,若当前es数据不存在,则删除当前遍历的es事务数据,返回步骤b;若当前es数据存在,得到当前es数据的json格式;
19、步骤f,判断当前es数据是否与当前遍历的es事务数据中的后像一致,若不一致,则删除当前遍历的es事务数据,返回步骤b;若一致,则判断当前遍历的es事务数据中的前像是否有数据;
20、步骤g,若前像没有数据,则删除当前es数据,同时删除当前遍历的es事务数据,返回步骤b;若前像有数据,则更新当前es数据为前像格式,同时删除当前遍历的es事务数据,返回步骤b;
21、步骤h,查询步骤1创建的本次事务id的所有mysql事务数据,按步骤j-步骤l对所有mysql事务数据进行遍历;
22、步骤i,判断遍历是否结束,若结束则回滚结束,否则进入步骤j;
23、步骤j,判断当前遍历的mysql事务数据中是否存在后像数据;若不存在后像数据,则根据步骤6查询到的表名、主键名和主键值,得到当前mysql数据,判断当前mysql数据是否存在;若当前mysql数据不存在,则创建与当前遍历的mysql事务数据中的前像相同的行,并删除当前遍历的mysql事务数据,返回步骤i;若当前mysql数据存在,则删除当前遍历的mysql事务数据,返回步骤i;若存在后像数据,则判断是否能根据当前遍历的mysql事务数据中的前像查询到当前mysql数据;
24、步骤k,若不能根据当前遍历的mysql事务数据中的前像查询到当前mysql数据,则删除当前遍历的mysql事务数据,返回步骤i;若能够根据当前遍历的mysql事务数据中的前像查询到当前mysql数据,则判断当前遍历的mysql事务数据中的前像是否存在;
25、步骤l,若当前遍历的mysql事务数据中的前像不存在,则删除当前mysql数据,同时删除当前遍历的mysql事务数据,返回步骤i;若当前遍历的mysql事务数据中的前像存在,则更新当前mysql数据为前像格式,同时删除当前遍历的mysql事务数据,返回步骤i。
26、一种计算机设备,包括存储器、处理器,以及存储在所述存储器中并能够在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如上所述的基于事务表处理es与mysql分布式事务问题的方法的步骤。
27、一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如上所述的基于事务表处理es与mysql分布式事务问题的方法的步骤。
28、本发明采用以上技术方案与现有技术相比,具有以下技术效果:
29、现有的对于分布式事务问题的解决方案只能被应用于不同mysql数据库中,不能被同时应用于es与mysql中,本发明提供了一种通用的解决es与mysql分布式事务问题的方法。
1.一种基于事务表处理es与mysql分布式事务问题的方法,其特征在于,包括如下步骤:
2.根据权利要求1所述的基于事务表处理es与mysql分布式事务问题的方法,其特征在于,所述回滚的具体步骤如下:
3.一种计算机设备,包括存储器、处理器,以及存储在所述存储器中并能够在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现如权利要求1至2任一项所述的基于事务表处理es与mysql分布式事务问题的方法的步骤。
4.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至2任一项所述的基于事务表处理es与mysql分布式事务问题的方法的步骤。