Seata AT模式
基本思路
先决条件
- 支持本地ACID事务的关系数据库。
- 通过JDBC访问数据库的Java应用程序。
整体机制
从两个阶段提交协议的演变:
- 阶段1:在同一本地事务中提交业务数据和回滚日志,然后释放本地锁和连接资源。
- 阶段2:
- 对于提交情况,异步快速地完成工作。
- 对于回滚情况,请根据阶段1中创建的回滚日志进行补偿。
写隔离
- 在全局锁,必须犯的阶段1的本地事务之前获取。
- 如果未获取全局锁,则不应提交本地事务。
- 如果失败,一个事务将尝试多次获取全局锁,但如果超时,则会发生超时,并回滚本地事务并释放本地锁。
例如:
两个事务tx1和tx2试图更新表a的字段m。m的原始值为1000。
tx1首先开始,开始本地事务,获取本地锁,然后执行更新操作:m = 1000-100 =900。tx1必须在提交本地事务之前获取全局锁,然后再提交本地事务并释放本地锁。
接下来,tx2开始本地事务,获取本地锁,执行更新操作:m = 900-100 =800。在tx2可以提交本地事务之前,它必须获取全局锁,但是全局锁可能由tx1持有,因此tx2会重试。在tx1执行全局提交并释放全局锁之后,tx2可以获取全局锁,然后可以提交本地事务并释放本地锁。
正在上传…重新上传取消
参见上图,tx1在阶段2中执行全局提交并释放全局锁,tx2获取全局锁并提交本地事务。
正在上传…重新上传取消
参见上图,如果tx1要执行全局回滚,则它必须获取本地锁以还原阶段1的更新操作。
但是,现在本地锁由希望获取全局锁的tx2持有,因此tx1无法回滚,但是它将尝试多次,直到tx2获取全局锁超时,然后tx2回滚本地事务并释放本地锁定后,tx1可以获取本地锁定,并成功执行分支回滚。
因为全局锁在整个过程中都由tx1保持,所以没有写脏问题。
读取隔离
本地数据库的隔离级别被读为commit commit或更高,因此全局事务的默认隔离级别被读为uncommitted。
如果当前需要读取全局事务的隔离级别,则Fescar可以通过SELECT FOR UPDATE语句来实现它。
转存失败重新上传取消
在全局锁是SELECT FOR UPDATE语句的执行过程中被应用,如果全局锁被其他事务持有,该交易将释放本地锁重试执行SELECT FOR UPDATE语句。在整个过程中,查询将被阻塞,直到获取了全局锁为止,如果获取了锁,则意味着另一个全局事务已提交,因此全局事务的隔离级别被读取为commit。
出于性能方面的考虑,Fescar只对SELECT FOR UPDATE做代理工作。对于常规的SELECT语句,什么也不做。
工作过程
以一个例子来说明它。
业务表:product
领域 | 类型 | 键 |
---|---|---|
ID | bigint(20) | PRI |
名称 | varchar(100) | |
以来 | varchar(100) |
AT模式下分支事务的sql:
update product set name = 'GTS' where name = 'TXC';
阶段1
处理:
- 解析sql:知道sql类型为更新操作,表名称为product,条件为name ='TXC',依此类推。
- 在更新之前查询数据(在图像之前命名):为了找到将要更新的数据,请通过上述where条件生成查询语句。
select id, name, since from product where name = 'TXC';
得到了“之前的图像”:
ID | 名称 | 以来 |
---|---|---|
1个 | TXC | 2014年 |
- 执行更新sql:更新名称等于“ GTS”的记录。
- 更新后查询数据(以图像命名):通过更新前图像数据的主键找到记录。
select id, name, since from product where id = 1;
得到了残像:
ID | 名称 | 以来 |
---|---|---|
1个 | GTS | 2014年 |
- 插入回滚日志:使用前后图像以及SQL语句相关信息构建回滚日志,然后插入table中
UNDO_LOG
。
{"branchId": 641789253,"undoItems": [{"afterImage": {"rows": [{"fields": [{"name": "id","type": 4,"value": 1}, {"name": "name","type": 12,"value": "GTS"}, {"name": "since","type": 12,"value": "2014"}]}],"tableName": "product"},"beforeImage": {"rows": [{"fields": [{"name": "id","type": 4,"value": 1}, {"name": "name","type": 12,"value": "TXC"}, {"name": "since","type": 12,"value": "2014"}]}],"tableName": "product"},"sqlType": "UPDATE"}],"xid": "xid:xxx"
}
- 在本地提交之前,该事务将应用提交给TC,以获取表产品中主键等于1的记录的全局锁。
- 提交本地事务:在同一本地事务中提交PRODUCT表的更新和UNDO_LOG表的插入。
- 向TC报告步骤7的结果。
阶段2-回退案例
- 从TC收到回滚请求后,开始本地事务,执行以下操作。
- 通过XID和分支ID检索UNDO LOG。
- 验证数据:将UNDO LOG中更新后的图像数据与当前数据进行比较,如果存在差异,则表示该数据已被当前事务以外的操作所更改,应采用不同的策略进行处理,其他将对此进行详细描述文献。
- 基于UNDO LOG中的前映像和业务SQL的相关信息,生成回滚SQL语句。
update product set name = 'TXC' where id = 1;
- 提交本地事务,将本地事务的执行结果(分支事务的回滚结果)报告给TC。
阶段2-提交案例
- 收到TC的提交请求后,将请求放入工作队列,立即将成功返回TC。
- 在队列中执行异步工作的阶段,将以批处理方式删除UNDO LOG。
附录
撤消日志表
UNDO_LOG表:不同数据库的数据类型略有不同。
对于MySQL示例:
领域 | 类型 |
---|---|
branch_id | bigint PK |
西德 | varchar(100) |
rollback_info | 长毛 |
log_status | tinyint |
log_created | 约会时间 |
log_modified | 约会时间 |
分机 | varchar(100) |
CREATE TABLE `undo_log` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'increment id',`branch_id` bigint(20) NOT NULL COMMENT 'branch transaction id',`xid` varchar(100) NOT NULL COMMENT 'global transaction id',`context` varchar(128) NOT NULL COMMENT 'undo_log context,such as serialization',`rollback_info` longblob NOT NULL COMMENT 'rollback info',`log_status` int(11) NOT NULL COMMENT '0:normal status,1:defense status',`log_created` datetime NOT NULL COMMENT 'create datetime',`log_modified` datetime NOT NULL COMMENT 'modify datetime',`ext` varchar(100) DEFAULT NULL COMMENT 'reserved field',PRIMARY KEY (`id`),UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='AT transaction mode undo table';
Seata AT模式相关推荐
- 阿里巴巴开源分布式框架Seata TCC模式深入分析
2019 年 3 月,蚂蚁金服加入分布式事务 Seata 的社区共建中,并贡献其 TCC 模式.本期是 SOFAChannel 第四期,主题:分布式事务 Seata TCC 模式深度解析,本文根据觉生 ...
- 分布式事务(Seata) 四大模式详解
前言 在上一节中我们讲解了,关于分布式事务和seata的基本介绍和使用,感兴趣的小伙伴可以回顾一下<别再说你不知道分布式事务了!> 最后小农也说了,下期会带给大家关于Seata中关于sea ...
- Seata Saga 模式快速入门和最佳实践
文|王特(花名:亦夏) Email:yixia.wt@antgroup.com 蚂蚁集团数据中间件核心开发 本文 4927 字 阅读 13 分钟 Seata 是一款开源的分布式事务解决方案,致力于在微 ...
- saga模式、Seata saga模式详解
文章目录 一.前言 二.SAGA模式 0.saga论文摘要 1.什么是长事务? 2.saga的组成 3.saga的两种执行场景 1)forward recovery 2)backward recove ...
- Seata TCC模式实战
前言 最近状态有点不好,所以创作动力不足,发觉日常生活一定要做减法,对少量的事保持持续专注的投入,养成良好的习惯. 今天补充下,Seata TCC模式实战. 一.TCC设计原则 从 TCC 模型的框架 ...
- 分布式事务 - Seata - TCC模式
目录 一.什么是TCC 二.AT & TCC区别 及 适用场景 三.代码集成示例 3.1 升级Seata 1.5.2 3.2 示例场景说明 3.3 TCC核心接口定义 3.4 TCC相关阶段规 ...
- Seata TCC模式-TCC模式
项目源码: https://gitee.com/benwang6/seata-samples 一.TCC 基本原理 TCC 与 Seata AT 事务一样都是两阶段事务,它与 AT 事务的主要区别为: ...
- Seata XA 模式示例分析
文章目录 1 下载示例 2 示例结构 3 业务服务 business-xa 3.1 模块结构 3.2 Controller 层 3.3 Service 层 3.4 stock Feign 客户端 3. ...
- 还不会分布式事务,seata xa模式入门实战送上
文章目录 前言 一.什么是seata? 二.seata原理说明 1.角色说明 2.什么是 Seata 的事务模式? 三.SEATA 的分布式案例 1.业务逻辑说明 2.架构图 3.SEATA 的分布式 ...
- 分布式事务解决方案Seata——AT模式详解
需要了解分布式事务的同学可以关注我的专栏一起学习,欢迎沟通:分布式事务 阿里开源分布式事务一站式解决方案seata基础认识可参见:分布式事务2PC协议之--Seata方案基本认识 概述 在我的另一篇关 ...
最新文章
- tomcat下list所有文件的目录
- 1038. Recover the Smallest Number (30)
- mysql group by cube_SQL Server 之 GROUP BY、GROUPING SETS、ROLLUP、CUBE
- java画笔覆盖在界面_Java画笔的简单实用方法
- setSystemUiVisibility() 与 getSystemUiVisibility() 显示隐藏状态栏
- elasticsearch6.0、jdk1.8、IK、kibana集群配置
- SharePoint 2013—创建Master Page
- 面试总结——Java篇
- ASP.net网页导出Excel中文乱码解决方案
- ATN项目(智能矩阵Atmatrix)是否能做到人工智能界的桥梁,从而改变世界?
- nginx代理内网服务器的图片服务器
- 解决双击.jar包无法运行
- 2012, PPSN,Geometric Semantic Genetic Programming,GSGP
- 身为一个SEO/SEM/运营专员,一天的工作是怎样的?
- 苹果 WWDC 2019 全记录:iPadOS独立、SwiftUI、Project Catalyst
- 大端(Big Endian)和小端(Little Endian)的区别
- R语言caret机器学习(二):数据预处理上
- Kcauldron服务端linux版,[1.7.10][KCauldron]FAN幻议会——工业|神秘|应用能源|热力|娱乐模式|龙之研究|无.......
- Java 利用Calender类制作日历,并且标注日期
- 英语不好能学python吗_英语和数学不好的人能学会Python编程吗?
热门文章
- AIX-vi操作-提示Unknown terminal type的问题解决方法
- 微软私有云分享(R2)22 计算机配置文件与基础设置
- XHTML重构(一)
- Unix/Linux IPC及线程间通信总结
- ANSYS——相同模型不同创建方式的同载荷同约束下的比较
- ANSYS——查看某一截面的云图分布(也叫做切片图)
- 碧桂园博智林机器人总部大楼_碧桂园职院新规划曝光!将建机器人实训大楼、新宿舍、水幕电影等...
- 推送公司今日菜单内容到手机
- 清除浮动小记,兼容Ie6,7
- 博客园的编辑器毛病真多.....