springcloud 分布式事务之TX-TCC

接上一篇文章 springcloud 分布式事务 之 TX-LCN 

TM 端不变

模式特点:

  • 该模式对代码的嵌入性高,要求每个业务需要写三种步骤的操作。
  • 该模式对有无本地事务控制都可以支持使用面广。
  • 数据一致性控制几乎完全由开发者控制,对业务开发难度要求高。

TC 端(order)业务代码

业务类注解:

@TccTransaction

 


import com.codingapi.txlcn.tc.annotation.LcnTransaction;
import com.codingapi.txlcn.tc.annotation.TccTransaction;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;

@RestController
public class OrderTccController {

   private static Map<String,Integer> maps = new HashMap<>();

    @Autowired
    private RestTemplate restTemplate;

    @PostMapping("/add-order-tcc")
    @Transactional(rollbackFor = Exception.class)
    @TccTransaction
    public String add(@RequestBody 实体类 bean){

        JSONObject date = new JSONObject();
        date.put("payName",bean.getOrderName()+"pay");

        restTemplate.postForEntity("http://lcn-pay/add-pay-tcc",date,String.class);

        //插入数据库操作
        ……
        //获取插入到的id 放到map中,方便调用失败后,事务回滚
        Integer id = bean.getId();
        maps.put("a",id);
        return "新增订单成功";
    }

   //插入成功的操作
    public String confirmAdd(实体类 bean){

        System.out.println("order confirm ");
        return "新增订单成功";
    }

    
    //插入失败的操作
    public String cancelAdd(实体类 bean){
        Integer a = maps.get("a");
        //数据库操作,删除数据
        System.out.println("order cancel ");
        return "新增订单成功";
    }
}

TC  端 (lcn-pay) 业务代码

import com.codingapi.txlcn.tc.annotation.LcnTransaction;
import com.codingapi.txlcn.tc.annotation.TccTransaction;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
public class PayTccController {

   private static Map<String,Integer> maps = new HashMap<>();


    @PostMapping("/add-pay-tcc")
    @Transactional(rollbackFor = Exception.class)
    @TccTransaction
    public String addPay(@RequestBody TblPay bean){
        //插入数据库操作
        ……
        //获取插入到的id 放入到map中,方便调用失败后 事务回滚
        Integer id = bean.getId();
        maps.put("a",id);
        int i = 1/0;
        return "新增支付成功";

    }
    //事务执行成功调用的方法
    public String confirmAddPay(实体类 bean){
        System.out.println("pay confirm");
        return "新增支付成功";

    }
    
    /**
     * 逆sql  事务执行失败调用的方法
     * @param bean
     * @return
     */
    public String cancelAddPay(实体类 bean){
        Integer a = maps.get("a");
        //数据库的删除操作
        ……
        return "取消支付成功";

    }
}

执行成功会调用以 confirmXXX的方法

执行失败会调用cancelXXX的方法

 

适用场景:  比如 写文件 写完mysql数据失败 需要回滚 这时文件内容需要清除掉

多个微服务之间 有的有的事务 有的没有事务的情况

支持事务的(mysql) 直接用lcn 就可以

TCC 并不是2pc的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值