alibaba seata 分布式事物如何根据业务自定义回滚

第一种方式

String xid = RootContext.getXID();
TransactionManager manager = TransactionManagerHolder.get();
GlobalStatus status = manager.rollback(xid);

第二种方式

GlobalTransaction globalTransactio=  GlobalTransactionContext.getCurrentOrCreate();
        globalTransactio.rollback();

注意事项

1. 代理数据源

必须开起全局事务,以及事务代理,才可以正常事务
启动类必须加上事务代理 @EnableAutoDataSourceProxy

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableAutoDataSourceProxy
public class OrderItemApp {
    public static void main(String[] args) {
        SpringApplication.run(OrderItemApp.class,args);
    }
}

2.开启全局事务

带事务的方法必须加上事务代理
@GlobalTransactional

 @GlobalTransactional
    public Map<String, Object> addOrderPay(Order o) {
        Map<String,Object> map=new HashMap<>();
        logger.error("全局事务开启");
        logger.error("全局事务id"+ RootContext.getXID());
        int result=testMapper.insert(o);
        OrderItem orderItem=new OrderItem(o.getId()+"",null);
        int zz=testClient.addOrderItem(orderItem);
        if(result>0 && zz>0){
            map.put("success",true);
            map.put("msg","成功");
        }else{
            map.put("success",false);
            map.put("msg","失败");
        }

        return map;
    }

你可能感兴趣的:(java)