04-XA模式

1.XA模式介绍

XA 规范 是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准,XA 规范 描述了全局的TM与局部的RM之间的接口,几乎所有主流的数据库都对 XA 规范 提供了支持。

1.1.两阶段提交

XA是规范,目前主流数据库都实现了这种规范,实现的原理都是基于两阶段提交。

正常情况:

 异常情况:

一阶段:

  事务协调者通知所有事务参与本地事务。

  本地事务执行完后报告事务执行状态给事务协调者,此时事务不提交,继续持有数据库锁。

二阶段:

  事务协调者基于一阶段的提交判断下一步的操作。

  如果一阶段都成功,则通知所有事务参与者,提交事务。

  如果一阶段任意一个参与者失败,泽同志以所有参与者,回滚事务。

1.2.seata的XA模型

 Seata对原始的XA模式做了简单的封装和改造,以适应自己的事务模型,基本架构如图:

 RM一阶段的工作:

  (1)注册分支事务到TC

  (2)执行业务sql但不提交

  (3)报告事务状态到TC

TC二阶段的工作:

  TC检查各分支事务的状态:

  a,如果都成功,通知RM提交事务。

  b,如果有失败,通知RM回滚事务。

RM二阶段的工作:

  接收TC的指令,提交或回滚事务。

1.3.优缺点

XA模式的优点:

  事务的强一致性,满足ACID原则。

  常用数据库都支持,实现简单,没有业务侵入。

XA模式的缺点是什么:

  因为一阶段需要锁定数据库资源,等到二阶段执行结束才释放,性能较差。

  依赖关系型数据库实现事务。

2.实现XA模式

(1)给每个微服务添加seata依赖

 <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>seata-spring-boot-starter</artifactId>
                    <groupId>io.seata</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>io.seata</groupId>
            <artifactId>seata-spring-boot-starter</artifactId>
            <version>${seata.version}</version>
        </dependency>
    </dependencies>

(2)修改application.yml文件(每个参与事务的微服务),开启XA模式

seata:
registry:
type: nacos
nacos:
server-addr: 192.168.136.160:8848
namespace: ""
group: DEFAULT_GROUP
application: seata-server
username: nacos
password: nacos
tx-service-group: seata-demo #事务组名称
service:
vgroup-mapping: # 事务组与cluster的映射关系
seata-demo: GZ
data-source-proxy-mode: XA

(3)给发起全局事务的入口方法添加@GlobalTransactional注解

 

posted @ 2023-04-24 22:02  老王的日常  阅读(113)  评论(0)    收藏  举报