初始数据库数据
正常情况
发送请求http://localhost:6001/transfer?amount=2
制造异常
在bank2微服务制造异常
异常后测试
发送请求http://localhost:6001/transfer?amount=2
Seata实现XA要点
⭐全局事务开始使用GlobalTransactional标识。
⭐每个本地事务方案仍然使用@Transactional标识。
⭐每个数据都需要创建undo_log表,此表是Seata保证本地事务一致性的关键。
创建 UNDO_LOG 表
SEATA XA 模式需要 UNDO-LOG 表
-- 注意此处0.3.0+ 增加唯一索引 ux_undo_log
CREATE TABLE undo_log (id bigint(20) NOT NULL AUTO_INCREMENT,branch_id bigint(20) NOT NULL,xid varchar(100) NOT NULL,context varchar(128) NOT NULL,rollback_info longblob NOT NULL,log_status int(11) NOT NULL,log_created datetime NOT NULL,log_modified datetime NOT NULL,ext varchar(100) DEFAULT NULL,PRIMARY KEY (id),UNIQUE KEY ux_undo_log (xid,branch_id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT
CHARSET=utf8;
添加依赖
com.alibaba.cloud spring-cloud-starter-alibabaseata
修改配置文件YML
seata:# 注册中心registry:type: fileservice:# seata服务端的地址和端口信息,多个使用英文分号分隔grouplist:default: 192.168.66.100:9999tx-service-group: my_test_tx_group
bank1微服务开启全局事物
@Transactional
@GlobalTransactional//开启全局事务
❗❗❗
将@GlobalTransactional注解标注在全局事务发起的Service实现方法上,开启全局事务 :GlobalTransactionalInterceptor会拦截@GlobalTransactional注解的方法,生成全局事务ID
(XID),XID会在整个分布式事务中传递。
在远程调用时,spring-cloud-alibaba-seata会拦截Feign调用将XID传递到下游服务。
bank2开启事物
测试分布式事物
发送请求http://localhost:6001/transfer?amount=2
注:
传统2PC(基于数据库XA协议)和Seata实现2PC的两种2PC方案,由于Seata的零入侵并且解决了传统2PC长期锁资源的问题,所以推荐采用Seata实现2PC。