tcc commit

This commit is contained in:
qiurunze 2019-01-04 17:53:21 +08:00
parent 79a5e03026
commit b02d4df088
5 changed files with 193 additions and 0 deletions

90
docs/code-rpc.md Normal file
View File

@ -0,0 +1,90 @@
### 分布式事务的讲解与实现
基础的ACID等等就不一一介绍了
有问题或者宝贵意见联系我的QQ,非常希望你的加入!
##简介:
基础的ACID等等就不一一介绍了柔性事务一类的大家在网上一搜都是可以先看看基础的
我的github都是实际操作加讲解我觉得写文章大篇大论浪费时间不如实际操作来的深刻
感谢大家支持!
1.tcc事务演进与场景
2.tcc事务源码解析与实际操作
3.分布式事务的实操与演进
2. **TCC事务的简介**
两段式事务
![整体流程](https://raw.githubusercontent.com/qiurunze123/imageall/master/liangduanshi.JPG)
三段式事务
![整体流程](https://raw.githubusercontent.com/qiurunze123/imageall/master/tcc.JPG)
TCC的优点
1.解决了扩应用的业务操作的原子性问题
2.数据库的二阶段提交提到了应用层实现
使用场景:
组合支付,账务一类的 比较要求强一致性高的场景使用
Tcc项目地址:
[![地址]()](https://github.com/changmingxie/tcc-transaction/tree/master-1.2.x)
如果你想 用dubbo的他的还不行有点错误请下载 (使用请先参考TCC文档)
[![地址]()](https://github.com/qiurunze123/tcc-dubbo)
效果图:
![效果图](https://raw.githubusercontent.com/qiurunze123/imageall/master/tcc.gif)
1、tcc-transaction-dubbo
1.1 字节码代理 -> 创建接口的代理对象
1.2 DubboTransactionContextEditor -> TRANSACTION_CONTEXT[标识事务状态]
利用Dubbo的隐式参数来传递关键的非业务数据
2、tcc-transaction-spring
封装了一些关键的Spring组件
3、问题
1、什么时候生成的TRANSACTION_CONTEXT隐式参数
2、如何判断一个大的事务下都有哪些小的事务
3、为什么要有@Compensable注解
4、两个拦截器都没有处理Confirm和Cancel
4、基础概念
主事务和分支事务【事务参与者】
5、事务拦截器作用[Spring AOP的基本概念要熟练掌握]
5.1 CompensableTransactionInterceptor
5.1.1 将事务区分为Root事务和分支事务
5.1.2 不断的修改数据库内的状态【初始化事务,修改事务状态】
5.1.3 注册和清除事务管理器中队列内容
5.2 ResourceCoordinatorInterceptor
5.2.1 主要处理try阶段的事情
5.2.2 在try阶段就将所有的"资源"封装完成并交给事务管理器
5.2.3 资源 -》 事务资源
事务的参与者
1、Confirm上下文
2、Cancel上下文
3、分支事务信息
5.2.4 事务管理器修改数据库状态
5.3 调用目标对象 -> order red cap
6、小结
6.1 事务的相关信息【全局事务编号,乐观锁版本等要持久化存储】
6.2 资源:*
TCC 【try-confirm-cancel】
try核心点 预留业务资源
把事务数据资源存入库中
6.3 流程:
6.3.1 注册和初始化事务 -> 组织事务参与者 -> 执行目标try方法 -> 执行confirm和cancel方法

View File

@ -0,0 +1,19 @@
package com.geekq.dubbo.springboot;
import dto.CapitalTradeOrderDto;
import org.mengyun.tcctransaction.api.Compensable;
import java.math.BigDecimal;
/**
* @author qiurunze
*/
public interface CapAccountTradeOrderService {
BigDecimal getCapAccountByUserId(Long userId );
@Compensable
public String record(CapitalTradeOrderDto tradeOrderDto);
}

View File

@ -31,4 +31,6 @@ public interface ServiceAPI {
@Compensable
String saveOrder(String fieldId,String seats,String seatsNum);
}

View File

@ -0,0 +1,62 @@
package dto;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* dto 不包含业务逻辑 pojo 对应表数据 vo 把指定页面的所有数据封装起来
*/
public class CapitalTradeOrderDto implements Serializable {
private static final long serialVersionUID = 6627401903410124642L;
private long selfUserId;
private long oppositeUserId;
private String orderTitle;
private String merchantOrderNo;
private BigDecimal amount;
public long getSelfUserId() {
return selfUserId;
}
public void setSelfUserId(long selfUserId) {
this.selfUserId = selfUserId;
}
public long getOppositeUserId() {
return oppositeUserId;
}
public void setOppositeUserId(long oppositeUserId) {
this.oppositeUserId = oppositeUserId;
}
public String getOrderTitle() {
return orderTitle;
}
public void setOrderTitle(String orderTitle) {
this.orderTitle = orderTitle;
}
public String getMerchantOrderNo() {
return merchantOrderNo;
}
public void setMerchantOrderNo(String merchantOrderNo) {
this.merchantOrderNo = merchantOrderNo;
}
public BigDecimal getAmount() {
return amount;
}
public void setAmount(BigDecimal amount) {
this.amount = amount;
}
}

View File

@ -0,0 +1,20 @@
package com.geekq.dubbo.springboot.privoder.transaction;
import com.geekq.dubbo.springboot.CapAccountTradeOrderService;
import dto.CapitalTradeOrderDto;
import java.math.BigDecimal;
public class CapServiceImpl implements CapAccountTradeOrderService {
@Override
public BigDecimal getCapAccountByUserId(Long userId) {
return null;
}
@Override
public String record(CapitalTradeOrderDto tradeOrderDto) {
return null;
}
}