seata实现2PC事务
Posted lisin-lee-cooper
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了seata实现2PC事务相关的知识,希望对你有一定的参考价值。
一.项目框架
本实例通过seata实现分布式事务,模拟两个账户跨行转账交易过程
业务框架:
数据库:mysql-5.7.25,
微服务框架:spring-boot-2.1.3、spring-cloud-Greenwich.RELEASE
seata客户端(RM、TM):spring-cloud-alibaba-seata-2.1.0.RELEASE seata服务端(TC):seata-server-0.7.1 下载地址
二.seata执行流程
1.成功提交
2.失败回滚
三.流程解析
1、每个RM使用DataSourceProxy连接数据库,其目的是使用ConnectionProxy,使用数据源和数据连接代理的目 的就是在第一阶段将undo_log和业务数据放在一个本地事务提交,这样就保存了只要有业务操作就一定有 undo_log。
2、在第一阶段undo_log中存放了数据修改前和修改后的值,为事务回滚作好准备,所以第一阶段完成就已经将分 支事务提交,也就释放了锁资源。 3、TM开启全局事务开始,将XID全局事务id放在事务上下文中,通过feign调用也将XID传入下游分支事务,每个分支事务将自己的Branch ID分支事务ID与XID关联。
4、第二阶段全局事务提交,TC会通知各各分支参与者提交分支事务,在第一阶段就已经提交了分支事务,这里各参与者只需要删除undo_log即可,并且可以异步执行,第二阶段很快可以完成。
5、第二阶段全局事务回滚,TC会通知各各分支参与者回滚分支事务,通过 XID 和 Branch ID 找到相应的回滚日志,通过回滚日志生成反向的 SQL 并执行,以完成分支事务回滚到之前的状态,如果回滚失败则会重试回滚操作。
以上是关于seata实现2PC事务的主要内容,如果未能解决你的问题,请参考以下文章