[微服务的绊脚石--分布式事务] Seata-AT模式深入分析

本文深入探讨Seata的AT模式,分析事务上下文、传播机制和全局锁的角色。通过RootContext管理XID,保证事务传播。讲解了如何在微服务间传播事务上下文,并解释了@GlobalTransactional和@GlobalLock的区别和应用场景。同时,讨论了全局锁的注册、查询和释放流程,以及为何ExceptionHandler可能导致全局事务失效的问题。
摘要由CSDN通过智能技术生成

//5. clear

resumeGlobalLockConfig(previousConfig);

triggerAfterCompletion();

cleanUp();

}

} finally {

// If the transaction is suspended, resume it.

if (suspendedResourcesHolder != null) {

tx.resume(suspendedResourcesHolder);

}

}

}

RM为什么不需要@GlobalTransactional?


在上一篇的代码示例中,我们只在TM端的BusinessService 方法上添加了@GlobalTransactional注解,而在下游微服务中并没有添加任何注解,为什么也可以当做全局事务处理呢?

事务上下文

我们先来看看 Seata 的事务上下文,它是由 RootContext 来管理的。

应用开启一个全局事务后,RootContext 会自动绑定该事务的 XID,事务结束(提交或回滚完成),RootContext 会自动解绑 XID。

// 绑定 XID

RootContext.bind(xid);

// 解绑 XID

String xid = RootContext.unbind();

应用可以通过 RootContext 的 API 接口来获取当前运行时的全局事务 XID。

// 获取 XID

String xid = RootContext.getXID();

应用是否运行在一个全局事务的上下文中,就是通过 RootContext 是否绑定 XID 来判定的。

public static boolean inGlobalTransaction() {

return CONTEXT_HOLDER.get(KEY_XID) != null;

}

事务传播

Seata 全局事务的传播机制就是指事务上下文的传播,根本上,就是 XID 的应用运行时的传播方式。

1. 服务内部的事务传播

默认的,RootContext 的实现是基于 ThreadLocal 的,即 XID 绑定在当前线程上下文中。

public class ThreadLocalContextCore implements ContextCore {

private ThreadLocal<Map<String, String>> threadLocal = new ThreadLocal<Map<String, String>>() {

@Override

protected Map<String, String> initialValue() {

return new HashMap<String, String>();

}

};

@Override

public String put(String key, String value) {

return threadLocal.get().put(key, value);

}

@Override

public String get(String key) {

return threadLocal.ge

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值