事务传播
Seata 全局事务的传播机制就是指事务上下文的传播,根本上,就是 XID 的应用运行时的传播方式。
跨服务调用场景下的事务传播,本质上就是要把 XID 通过服务调用传递到服务提供方,并绑定到 RootContext 中去。
只要能做到这点,理论上 Seata 可以支持任意的微服务框架。
-
只要是同一个请求链路,可以将XID作为传输参数传递给服务提供者
-
业务方法中获取XID,如下示例
调用者@RequestMapping(value = "testDataApi") @GlobalTransactional public String testDataApi() throws TransactionException { System.out.println("---------XID--------:"+RootContext.getXID()); // 我的调用方式是RPC+feign跨服务调用 cn.jbone.common.rpc.Result<Map<String, Object>> data= apiFeign.addData(RootContext.getXID()); log.info("------tagTree---------={}",tagTree); if(data== null){ log.info("------手动回滚---------"); // 手动回滚 GlobalTransactionContext.reload(RootContext.getXID()).rollback(); } return "1"; }
服务提供者
@Override @RequestMapping(value = "addData", method = {RequestMethod.POST}) public Result<Map<String, Object>> addData(@RequestParam("xid")String xid) { // 绑定 XID,自动创建分支事物 RootContext.bind(xid); // 异常后,整个调用链路回滚 int i=10/0; return new Result<>(resultMap); }
// 挂起(暂停)
String xid = RootContext.unbind();
// TODO: 运行在全局事务外的业务逻辑
// 恢复全局事务上下文
RootContext.bind(xid);