一.seata是什么?能干什么? ? ? ?Senta是一款开源的分布式事务解决方案,致力于在微服务架构下提供简单易用的分布式事务服务.
二.大致理论. 1.组成: ? ? ? 在使用Senta处理分布式事务时,有一个典型的1+3模型,也就是1个事务id,还有事务管理,事务协调,资源管理三个组件.
- Transaction ID:事务id,全局唯一
- Transaction Coordinator(TC) :负责事务协调,维护全局事务运行的状态,控制全局事务的提交或回滚(可以理解为运行的seata服务).
- Transaction Manager? :事务管理,控制事务的边界,开启一个全局事务(谁加了GlobalTransactional注解,谁就是TM)
- Resource Manager(RM) :资源管理,和数据库进行交互,控制每一个分支事务,汇报状态,驱动本地事务的提交和回滚.
2.使用前提: ? ? ?基于支持本地 ACID 事务的关系型数据库。 ? ? ? Java 应用,通过 JDBC 访问数据库。 3.处理事务流程: 其实就是两个阶段提交的变形 一阶段: ? ? ? (1)生成前镜像(就是保存原先的数据) ? ? ? (2)执行sql ? ? ? (3)生成后镜像(保存更改后的数据) ? ? ? (4)将前后镜像的数据以及业务sql相关信息保存到UNDO.LOG日志中 ? ? ? (5)提交前,向TC注册分支,申请该更新记录的全局锁 ? ? ? (6)进行事务提交,将业务数据的更新和前面生成的UNDO.LOG一并提交 ? ? ? (7)将本地事务的提交结果上报给TC. 二阶段: ? 如果需要回滚: ? ? ? (1)在UNDO.LOG中找到响应的记录,将当前数据与日志中后镜像的数据进行比较,如果发生变动,则表明有其他全局事务做了修改,这个处理措施 需要根据配置的不同,进行相关的操作. ? ? ? (2)生成并执行对应的回滚语句. ? ? ? (3)提交事务,并将事务提交结果给到TC. ? 如果需要提交: ? ? ? (1)收到TC的分支提交请求,将请求放到一个异步队列中,马上返回提交成功的结果给TC. ? ? ? (2)异步队列中的请求,将会异步和批量的删除UNDO.LOG日志中的记录.
其实这里的思想也类似于CAS,乐观锁的操作,保存前后值来确保数据的总体正确性.
seata官网地址: ? ? ? https://seata.io/zh-cn/docs/overview/what-is-seata.html
|