支付宝 分布式事务服务 DTS三-copy

摘要:
让我们看看如何在DTS中实现此场景。App2和app3分别作为参与者实现准备、提交和回滚接口。我们将准备阶段称为第一阶段,将提交/回滚阶段称为第二阶段。上图是一个典型的DTS事务流示例。第一阶段包含在启动器的本地事务模板中。启动器的本地事务完成后,第二阶段开始执行。第二阶段结束,DTS事务结束。

典型场景和实现原理
首先来看一个典型的分布式事务场景

在这个例子中,app1 作为分布式事务的发起方调用了参与者 app2 的 insert 操作和 app3 的 update 操作,之后调用自己的本地 insert 操作,在这个分布式事务中包含了 3 次对 db 的操作,而 3 个 db 分属于不同的系统,图中虚线覆盖的范围是 app1 的一个本地事务模版的代码范围。
来看看在 DTS 内部针对这个场景是如何实现的。 

app2 和 app3 作为参与者分别实现了 prepare,commit 和 rollback 接口
我们将 prepare 阶段称为第一阶段,commit/rollback 阶段称为第二阶段
上图就是典型的 DTS 事务流转示例,第一阶段被包含在发起方的本地事务模版中,发起方的本地事务结束后,开始执行二阶段操作,二阶段结束,DTS 事务整个结束。
针对以上运行流程,我们可以总结如下
DTS 分布式事务是基于两阶段提交( 2 phase commit,简称 2pc)原理
事务发起方是分布式事务的协调者
事务发起方本地事务的最终状态(提交或回滚)决定整个分布式事务的最终状态
分布式事务必须在本地事务模板中进行
参与者通过配置在 xml 中的拦截器来完成 action 信息的获取和数据插入
事务参与者的接口需要支持两阶段。发起方(使用者)只关注第一阶段的方法,第二阶段由框架自动调用。
再来看看以上的说明对应的发起方代码是怎样的

对应的参与者接口是这样的

最核心的地方在于 prepare 接口打上了@TwoPhaseBusinessAction 标注,通过这个标注DTS 框架可以感知到这个服务就是一个 DTS 的参与者

接下来,结合上面这个例子让我们详细分析下 DTS 内部的工作原理,大体如下图 

核心点:
使用数据库持久化记录事务数据,且使用独立的事务模版,也就是单独事务
特别关注红线对应的 sql,这是一句 update 主事务表的 sql,而这句 sql 是在发起方的本地事务中的,这样一来就和发起方的事务绑定了,如果发起方本地事务成功,则这句 update 语句必然成功,如果发起方本地事务失败,则这句 update 语句必然失败,这样我们就可以根据 activity 表的事务记录的状态来决定这笔分布式最终的状态是成功还是失败了
在调用参与者前,启动单独事务插入代表这个参与者的分支事务记录,以供后续恢复使用
二阶段是通过 spring 提供的事务同步器实现的,如果发起方的本地事务失败,则二阶段自动回滚所有参与者,如果发起方的本地事务成功,则二阶段自动提交所有参与者。二阶段结束后,删除所有事务记录
————————————————
版权声明:本文为CSDN博主「chenshiying007」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_27384769/article/details/79304017

免责声明:文章转载自《支付宝 分布式事务服务 DTS三-copy》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JENKINS针对不同项目组对用户进行权限分配CRM 安装过程 AD+SQL+CRM下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android批量插入数据到SQLite数据库

Android中在sqlite插入数据的时候默认一条语句就是一个事务,因此如果存在上万条数据插入的话,那就需要执行上万次插入操作,操作速度可想而知。因此在Android中插入数据时,使用批量插入的方式可以大大提高插入速度。   有时需要把一些数据内置到应用中,常用的有以下2种方式:其一直接拷贝制作好的SQLite数据库文件,其二是使用系统提供的数据库,然...

DBCC命令汇总

引用了链接:http://bbs.chinaunix.net/thread-2315221-1-1.html IF (OBJECT_ID('#tmpDBCC04') IS NOT NULL)     DROP TABLE #tmpDBCC04 GO CREATE TABLE #tmpDBCC04 (      CurrentLSN Varchar(200)...

【原创】Spring连接、事务代码分析

1.JdbcTemplate 当不使用事务时,jdbcTemplate的模板类,通过 Connection con = DataSourceUtils.getConnection(getDataSource()); 方法,首先去当前线程的上下文中寻找绑定的数据库连接,若没找到,则新建一个连接,即从DataSource中创建一个新的连接: Connecti...

java笔试练习题

选择题(共50题,每题1.5分,共75分。多选题选不全或选错都不得分。)1. 以下属于面向对象的特征的是(C,D)。(两项)A) 重载B) 重写C) 封装D) 继承2. 以下代码运行输出是(C)public class Person{private String name=”Person”;int age=0;}public class Child ext...

web 阶段的一些简答题

1.jsp 9个隐含对象 2. jsp 4大域对象 3.mybatis 中 #{} %{ } 的区别于联系 4. Servlet容器默认是采用单实例多线程的方式处理多个请求的: 5.Cookie 与Session 的异同 6. 请描述对web 服务器的理解(Tomcat),请列举出tomcat7下的目录以及各个目录的作用 7. 请描述 servlet与st...

【转】Sqlserver通过链接服务器访问Oracle的解决办法

一、创建sqlserver链接服务(sqlserver链接oracle)  首先sqlserver 链接oracle可以通过两个访问接口: “MSDAORA” 和“OraOLEDB.Oracle” 1、“MSDAORA”访问接口是由Microsoft OLE DB Provider for Oracle提供的,这里建议不使用此接口进行链接。通过该访问接口建...