diff --git a/userguide.md b/userguide.md new file mode 100644 index 00000000..e10997e7 --- /dev/null +++ b/userguide.md @@ -0,0 +1,80 @@ + +配置tcc-transaction + +在项目中需要引用tcc-transaction-spring jar包,如使用maven依赖: + + org.mengyun + tcc-transaction-spring + ${project.version} + + +另外,启动应用时,需要将tcc-transaction-spring jar中的tcc-transaction.xml加入到classpath中。如在web.xml中配置: + + contextConfigLocation + classpath:tcc-transaction.xml + + + +如何发布Tcc服务 + +发布一个Tcc服务方法,可被远程调用并参与到Tcc事务中,发布Tcc服务方法有下面四个约束: +1. 在服务方法上加上@Compensable注解 +2. 服务方法第一个入参类型为org.mengyun.tcctransaction.api.TransactionContext +3. 服务方法的入参都须能序列化(实现Serializable接口) +4. try方法、confirm方法和cancel方法入参类型须一样 + +tcc-transaction将拦截加上了@Compensable注解的服务方法,并根据Compensalbe的confirmMethod和cancelMethod获取在CONFRIM阶段和CANCEL阶段需要调用的方法。 +tcc-transaction在调用confirmMethod或是cancelMethod时是根据发布Tcc服务的接口类在Spring的ApplicationContext中获取Tcc服务实例,并调用confirmMethod或cancelMethod指定方法。 +因此如果是使用动态代理的方式实现aop(默认方式),则confirmMethod和cancelMethod需在接口类中声明,如果使用动态字节码技术实现aop(如指定aspectj-autoproxy的proxy-target-class属性为true),则无需在接口类中声明。 + +服务方法第一个org.mengyun.tcctransaction.api.TransactionContext类型的入参为预留入参,tcc-transaction使用此参数将在远程调用时传递TCC事务上下文信息。 +tcc-transaction在执行服务过程中会将Tcc服务的上下文持久化,包括所有入参,内部实现为将入参使用jdk自带的序列化机制序列化为为byte流,所以需要实现Serializable接口。 + +在tcc-transaction-dubbo-capital中发布Tcc服务示例: + +try方法: +@Compensable(confirmMethod = "confirmRecord", cancelMethod = "cancelRecord") + public void record(TransactionContext transactionContext, CapitalTradeOrderDto tradeOrderDto) { + +confirm方法: +public void confirmRecord(TransactionContext transactionContext, CapitalTradeOrderDto tradeOrderDto) { + +cancel方法: +public void cancelRecord(TransactionContext transactionContext, CapitalTradeOrderDto tradeOrderDto) { + +在tcc-transaction-dubbo-redpacket中发布Tcc服务示例: + +try方法: +@Compensable(confirmMethod = "confirmRecord",cancelMethod = "cancelRecord") + public void record(TransactionContext transactionContext, RedPacketTradeOrderDto tradeOrderDto) { + +confirm方法: +public void confirmRecord(TransactionContext transactionContext, RedPacketTradeOrderDto tradeOrderDto) { + +cancel方法: +public void cancelRecord(TransactionContext transactionContext, RedPacketTradeOrderDto tradeOrderDto) { + +如何调用远程Tcc服务 +调用远程Tcc服务,将远程Tcc服务参与到本地Tcc事务中,本地的服务方法也需要声明为Tcc服务,与发布一个Tcc服务不同,本地Tcc服务方法有三个约束: +1. 在服务方法上加上@Compensable注解 +2. 服务方法的入参都须能序列化(实现Serializable接口) +3. try方法、confirm方法和cancel方法入参类型须一样 + +即与发布Tcc服务不同的是本地Tcc服务无需声明服务方法第一个入参类型为org.mengyun.tcctransaction.api.TransactionContext。 + +在tcc-transaction-dubbo-order中调用远程Tcc服务示例: + +try方法: +@Compensable(confirmMethod = "confirmMakePayment",cancelMethod = "cancelMakePayment") + public void makePayment(Order order, BigDecimal redPacketPayAmount, BigDecimal capitalPayAmount) { + +confirm方法: +public void confirmMakePayment(Order order, BigDecimal redPacketPayAmount, BigDecimal capitalPayAmount) { + +cancel方法: +public void cancelMakePayment(Order order, BigDecimal redPacketPayAmount, BigDecimal capitalPayAmount) { + + + + +