接上一篇文章 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的