Bag分布式事务:对SAGA分布式事务的改进

Stella981
• 阅读 661

最近打算给jSqlBox添加分布式事务功能,研究了几种分布式事务方案,对SAGA模式比较感兴趣,它是通过将多个事务隔离成多个单个事务,顺序执行(或回滚阶段倒序对冲)来完成的,但是SAGA分布式事务不能保证隔离性的问题,因为单纯的SAGA模式没有锁住资源。经考虑发现在SAGA的思路上,利用事务嵌套和全局锁,可以实现一种简单的分布式事务实现,暂时给它起个新名字叫“Bag分布式事务”,因为它实现的关键是所有事务都是层层嵌套的,象一个袋子装在另一个袋子里。这里以三层事务嵌套作为示例 , 见下图:

Bag分布式事务:对SAGA分布式事务的改进

它将多个单机事务嵌套使用,并在最里层的事务里获取一个全局排它锁,这样如果业务出错,或排它锁未获取成功的情况下,所有事务自动回滚,无需人为干预,从而简洁地保证了数据的最终一致性。如果因为硬件、网络故障导致部分提交的现象,在业务层可以先尝试倒序执行UndoSQL来回滚全局事务, 回滚的最后一步是解锁。 
这种分布式事务方案的优点是实现简单,无需专门的全局事务管理器,UndoSQL的尝试调用可以包含在业务方法里。而且数据库只须要支持单机ACID事务,无须XA协议支持,通用性好。 
如果网络故障较多的情况下,有可能造成部分提交且无法解锁的情况(实际上是比较罕见的,因为它发生的前题是业务SQL执行没有异常抛出,且所有数据库连接在此之前正常工作,而且业务方法里的UndoSQL调用失败),这时除了人为介入外,如果工作量大也可以考虑设置一个单独的事务回滚服务器,专门用来监控和自动回滚锁定的事务,因为undoSQL或快照已经被保存在业务数据库里了。
这种模式下在最里层的事务里需要获得一个全局锁,如果不讲究高可用性的话,可以通过指定任意一个数据库来存放。

2019.5.31补充:

最近看到了这篇文章《关于分库分表,这有一套大而全的轻量级架构设计思路》,我的构思实际上就是这篇文章中提到的“最大努力保证模式”,不是什么新发明,只不过是在最里层加上了一个全局排它锁而已。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
一种基于柔性事务的分布式事务解决方案设计探究
1背景市面上常见的有,2pc/3pc、tcc、saga等常见的分布式事务解决方案,但是实际实施起来框架比较重,设计开发比较繁琐,不易于快速开发上手。本文提供一种基于柔性事务设计的简单易上手的分布式事务设计方案,用于解决常见的分布式事务常见
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
MySQL数据库InnoDB存储引擎Log漫游(1)
作者:宋利兵来源:MySQL代码研究(mysqlcode)0、导读本文介绍了InnoDB引擎如何利用UndoLog和RedoLog来保证事务的原子性、持久性原理,以及InnoDB引擎实现UndoLog和RedoLog的基本思路。00–UndoLogUndoLog是为了实现事务的原子性,
Stella981 Stella981
3年前
BeetlSQL 3.1.0 发布,spring saga 事务支持
本次发布增强了Saga在spring下的支持,使用kafka提供重试以及重试失败后放入丢弃队列里Saga是用来在微服务中的长事务管理,具备ACID中的ACD,不具备I,隔离性。在一定业务条件下,可以使用Saga非常简单和方便的管理微服务事务。同理,也可以用于管理多库事务Saga要求微服务提供回滚操作,然后如果需要回滚,有Saga编排调度各个微服务对应
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
线上SQL超时场景分析-MySQL超时之间隙锁 | 京东物流技术团队
前言之前遇到过一个由MySQL间隙锁引发线上sql执行超时的场景,记录一下。背景说明分布式事务消息表:业务上使用消息表的方式,依赖本地事务,实现了一套分布式事务方案消息表名:mqmessages数据量:3000多万索引:createtime和statuss
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这