seata代码控制回滚和临时挂起分布式事物
2023-02-18 16:27:47 时间
seata代码控制回滚和临时挂起分布式事物
一、说明
此处只是简单的记录一下,使用了 Seata
后,如何手动 回滚分布式事物和临时挂起分布式事务,Seata的整合不做详细的说明。
二、功能实现
1、手动回滚分布式事物
举例:
- 比如我们通过feign去调用第三方服务,feign服务出现了降级。
- 调用第三方api,第三方api调用失败,是通过 错误吗 来告知是成功还是失败的。
class 手动回滚分布式事物{
public void 部分代码() {
if (RootContext.inGlobalTransaction()) {
try {
GlobalTransactionContext.reload(RootContext.getXID()).rollback();
} catch (TransactionException e) {
log.error("回滚分布式事物出现异常", e);
}
}
}
}
访问请求:
$ curl -X GET http://localhost:50017/rollbackTx\?accountId\=1\&amount\=10\&hasException\=false
结果:
- 当账户服务的返回值 <= 5 时,事物回滚,账户服务不扣钱,订单服务不产生订单
- 当账户服务的返回值 > 5 时,账户服务扣钱,订单服务产生订单
2、临时挂起分布式事物
举例:
- 在一个大的分布式事务中,如果分布式事物的某个环节出现了异常,通过
try{}catch(){}
后,需要记录一个日志到数据库中,此处可能需要挂起这个分布式事务,让记录日志的方法不参与到分布式事务中。
下方这个案例是模拟下单操作,下单分为 账户服务扣钱和产生订单,此处将账户服务扣钱操作排除到分布式事务外,产生订单参与分布式事务。
class 临时挂起分布式事物 {
@GlobalTransactional(rollbackFor = Exception.class)
public void 部分代码(){
String xid = RootContext.getXID();
System.out.println("createAccountOrder:" + xid);
// 解除 xid 的绑定
RootContext.unbind();
// 1、远程扣减账户余额
// =============== 此方法不在分布式事务中=================
boolean debitResult = remoteDebit(accountId, amount);
// =============== 此方法不在分布式事务中=================
// 重新绑定 xid
RootContext.bind(xid);
// 2、下订单
orderService.createOrder(accountId, amount);
// 抛出异常
int i = 1 / 0;
}
}
访问请求:
$ curl -X GET http://localhost:50017/bindAndUnBind\?accountId\=1\&amount\=10\&hasException\=false
结果: 账户服务扣钱,没有产生订单
三、完整代码
https://gitee.com/huan1993/spring-cloud-parent/tree/master/seata/seata-springboot-rollback-tx
四 参考链接
http://seata.io/zh-cn/blog/seata-spring-boot-aop-aspectj.html
相关文章
- [PHP] 算法-合并两个有序链表为一个有序链表的PHP实现
- [PHP]算法-最大子数组问题思路
- [PHP] 数据结构-反转链表PHP实现
- [PHP] 数据结构-单链表头插法PHP实现
- [PHP] 数据结构-从尾到头打印链表PHP实现
- [PHP] 数据结构-输出链表倒数第k个结点PHP实现
- [PHP]算法-归并排序的PHP实现
- [PHP] 数据结构-二叉树的创建PHP实现
- [PHP] 数据结构-循环链表的PHP实现
- [PHP] 数据结构-链表创建-插入-删除-查找的PHP实现
- [PHP] 算法-两个n位的二进制整数相加问题PHP实现
- [PHP] 数据结构-线性表的顺序存储结构PHP实现
- [日常] 链表-头结点和头指针的区别
- [日常] C语言中指针变量
- [日常] 算法-单链表的创建-尾插法
- [日常] 算法-单链表的创建
- [日常] 算法-旋转字符串-三步翻转法
- [日常] 算法-旋转字符串-暴力移位法
- [日常] C语言中的字符数组和字符串
- [日常] 高性能MySQL-索引