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可以获取全局锁,然后可以提交本地事务并释放本地锁。

seata_at-1.pnguploading.4e448015.gif正在上传…重新上传取消写隔离:提交

参见上图,tx1在阶段2中执行全局提交并释放全局锁,tx2获取全局锁并提交本地事务。

seata_at-2.pnguploading.4e448015.gif正在上传…重新上传取消写隔离:回滚

参见上图,如果tx1要执行全局回滚,则它必须获取本地锁以还原阶段1的更新操作。

但是,现在本地锁由希望获取全局锁的tx2持有,因此tx1无法回滚,但是它将尝试多次,直到tx2获取全局锁超时,然后tx2回滚本地事务并释放本地锁定后,tx1可以获取本地锁定,并成功执行分支回滚。

因为全局锁在整个过程中都由tx1保持,所以没有写脏问题。

读取隔离

本地数据库的隔离级别被读为commit commit或更高,因此全局事务的默认隔离级别被读为uncommitted

如果当前需要读取全局事务的隔离级别,则Fescar可以通过SELECT FOR UPDATE语句来实现它。

seata_at-3.pnguploading.4e448015.gif转存失败重新上传取消读取隔离:选择更新

全局锁是SELECT FOR UPDATE语句的执行过程中被应用,如果全局锁被其他事务持有,该交易将释放本地锁重试执行SELECT FOR UPDATE语句。在整个过程中,查询将被阻塞,直到获取了全局锁为止,如果获取了锁,则意味着另一个全局事务已提交,因此全局事务的隔离级别被读取为commit

出于性能方面的考虑,Fescar只对SELECT FOR UPDATE做代理工作。对于常规的SELECT语句,什么也不做。

工作过程

以一个例子来说明它。

业务表:product

领域类型
IDbigint(20)PRI
名称varchar(100) 
以来varchar(100) 

AT模式下分支事务的sql:

update product set name = 'GTS' where name = 'TXC';

阶段1

处理:

  1. 解析sql:知道sql类型为更新操作,表名称为product,条件为name ='TXC',依此类推。
  2. 在更新之前查询数据(在图像之前命名):为了找到将要更新的数据,请通过上述where条件生成查询语句。
select id, name, since from product where name = 'TXC';

得到了“之前的图像”:

ID名称以来
1个TXC2014年
  1. 执行更新sql:更新名称等于“ GTS”的记录。
  2. 更新后查询数据(以图像命名):通过更新前图像数据的主键找到记录。
select id, name, since from product where id = 1;

得到了残像:

ID名称以来
1个GTS2014年
  1. 插入回滚日志:使用前后图像以及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"
}
  1. 在本地提交之前,该事务将应用提交给TC,以获取表产品中主键等于1的记录的全局锁
  2. 提交本地事务:在同一本地事务中提交PRODUCT表的更新和UNDO_LOG表的插入。
  3. 向TC报告步骤7的结果。

阶段2-回退案例

  1. 从TC收到回滚请求后,开始本地事务,执行以下操作。
  2. 通过XID和分支ID检索UNDO LOG。
  3. 验证数据:将UNDO LOG中更新后的图像数据与当前数据进行比较,如果存在差异,则表示该数据已被当前事务以外的操作所更改,应采用不同的策略进行处理,其他将对此进行详细描述文献。
  4. 基于UNDO LOG中的前映像和业务SQL的相关信息,生成回滚SQL语句。
update product set name = 'TXC' where id = 1;
  1. 提交本地事务,将本地事务的执行结果(分支事务的回滚结果)报告给TC。

阶段2-提交案例

  1. 收到TC的提交请求后,将请求放入工作队列,立即将成功返回TC。
  2. 在队列中执行异步工作的阶段,将以批处理方式删除UNDO LOG。

附录

撤消日志表

UNDO_LOG表:不同数据库的数据类型略有不同。

对于MySQL示例:

领域类型
branch_idbigint PK
西德varchar(100)
rollback_info长毛
log_statustinyint
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';

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272070.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自媒体各大平台收益对比_哪些自媒体平台没有新手期,适合小白撸收益?

2-26把我设置为星标,不错过每一次的干货~各大自媒体平台的新手期总是让小白们望而却步,特别是百家号审核非常严格,如果没思路、没人指导,过新手有难度。不过,还是有很多平台对新手宝宝很友好,没…

Linux关于文件的权限笔记

1、调整文件的权限命令:chmodLinux的每个文件都定义了文件的拥有者:u(user)、拥有组:g(group)、其他人:o(others)权限,对应的权限用rwx的组合来定义。使用chmod命令&…

启动rrt什么意思_python学习第144课--创建虚拟机、设置虚拟机参数以及启动虚拟机...

【每天几分钟,从零入门python编程的世界!】上节我们介绍了下载虚拟机以及centOS的相关事项,现在我们创建虚拟机。●创建虚拟机安装好virtualbox之后,我们点击Oracle VM VirtualBox打开管理器,界面如下图:你…

Android按键响应的几种方式、安卓页面的跳转、页面跳转传参、页面自动跳转、Activity(页面)的生命周期

按键响应的第一种方式: 在XML文件里面设置按键的onClick绑定函数。就像下面的代码,给Button设置onClick属性,在按键被按下的时候,会调用java文件里面的onClickbtton1这个函数,因为现已将它和这个按钮进行了绑定。利用…

pycharm体验

查看python版本 退出 exit()

Linux文本检索命令grep笔记

grep是在linux系统中基于行文本非常实用检索工具,通过该命令可以将匹配到的结果信息输出到终端控制台。语法格式:grep [-ivnc] 需要匹配的内容 文件名常用参数说明:-i 检索的时候不区分大小写-c 检索到的匹配行数-n 检索到的匹配行显式具体的…

成立出版社的条件_创始人亲述:法国鸿飞文化出版社的诞生故事和做书心得

鸿飞文化出版社2007年在法国创立,专门出版由中国作家和法国插画师共同创作的图画书。创始人叶俊良引用苏东坡的诗句“人生到处知何似,应似飞鸿踏雪泥。泥上偶然留指爪,鸿飞那复计东西。”为出版社取名,希望通过这些“印迹”为读者…

python单行注释和多行注释

# 后面加一个空格,下面就不会有波浪线了 点击小灯泡下的第一行,可以调整注释格式 多行注释

Linux文件查询笔记

1、数据库查找命令:locateLinux也可以通过locate命令查找文件,locate命令主要是依据一个数据库文件来执行文件的查找,默认情况下Linux每天会默认检索系统中的所有文件,然后把检索的文件信息记录到数据库文件中。因为运行locate命令…

柱坐标系下的ns方程_麦克斯韦方程组小结

一、▽ 算子、点积、叉积l▽ 算子叫“del”算子&#xff0c;即<< span"">∂/∂x,∂/∂y,∂/∂z>,可以理解为一个符号向量&#xff0c;向量里的元素是偏微分运算符号&#xff0c;没有任何具体意义&#xff0c;只是一个表示方法。ln维向量的内积定义如下&a…

Linux进程终止命令kill或killall​笔记

在linux命令下&#xff0c;如果需要终止某个进程&#xff0c;可以使用kill或者killall等命令来实现。终止命令的原理都是向linux内核发送一个系统操作的信号以及某个进程的ID&#xff0c;然后系统内核会根据指定的进程ID进行相应的处理。kill命令典型的用法&#xff1a;首先使用…

Visual Studio的调试技巧

Visual Studio的调试技巧 【原文地址】 Debugging Tips with Visual Studio 2010 【原文发表日期】 2010/8/19 10:48 AM 这是我写的关于VS2010和.Net4发布的博客系列的第26篇。 今天的博文包含了一些有用的能用于VS的调试技巧。 我的朋友 Scott Cate&#xff08;他写了很多很…

Linux排序命令sort笔记

很多时候Linux需要对文本相对比较规范的文本数据进行排序&#xff0c;这时候可以使用Linux系统下的sort命令进行处理。语法格式&#xff1a;sort [-ntkr] filename常用参数&#xff1a;-n 根据数字进行排序-t 指定的分隔符-k 指定分隔符的第几列-r 降序排序用法示例&#xff1a…

redirect路由配置 vue_Web前端:Vue路由进阶配置

大家好&#xff0c;我来了&#xff0c;本期为大家带来的前端开发知识是”Web前端&#xff1a;Vue路由进阶配置“&#xff0c;有兴趣做前端的朋友&#xff0c;和我一起来看看吧&#xff01;1. 页面打开权限流程页面是否能打开有以下两点判断&#xff1a;1. 判断是否增加登陆的判…

python格式化输出

格式化输出字符串 格式化输出整数 格式化输出浮点数 输出&

Linux常用内建命令笔记

Linux系统为了便于运维人员对系统的操作&#xff0c;所以内建了很多shell命令。一般来说linux系统的内建命令会比执行外部的shell命令执行更快。因为执行内建命令相当于调用当前shell进程里面的函数&#xff0c;而执行外部命令的话需要出发IO操作还要fork一个单独的进程来执行&…

asp手机拍照显示_会员动态飞凯材料120吨TFTLCD混合液晶显示项目,建后五年达产...

来源 &#xff1a;全景网10月26日&#xff0c;在飞凯材料可转债发行网上路演会议上&#xff0c;该公司相关人员也对投资者关心的问题进行解答。关于发行8.25亿元可转换债券&#xff0c;飞凯材料表示本次募集资金扣除发行费用后将用于投资以下项目&#xff1a;10000t/a紫外固化光…

python中变量的命名和关键字和变量的命名规则

[False, None, True, and, as, assert, break, class, continue, def, del, elif, else, except, finally, for, from, global, if, import, in, is, lambda, nonlocal, not, or, pass, raise, return, try, while, with, yield]