liuyangming / ByteTCC

ByteTCC is a distributed transaction manager based on the TCC(Try/Confirm/Cancel) mechanism. It’s compatible with the JTA specification. User guide: https://github.com/liuyangming/ByteTCC/wiki
https://www.bytesoft.org/
GNU Lesser General Public License v3.0
2.9k stars 911 forks source link

关于try和cancel的一些疑问 #84

Closed yuxiao97 closed 5 years ago

yuxiao97 commented 6 years ago

从示例代码中了解到,cancel阶段执行的东西是try中的反向操作,如下图所示

Try

image

Cancel

image 对此实现表示怀疑,难道仅仅是这样的反向操作来达到所谓的“事务性”吗?望作者不吝赐教!

liuyangming commented 6 years ago

ByteTCC-sample只是一个样例演示如何使用Confirm/Cancel,实际上完全可以在Try中直接increase,然后在cancel时做decrease。只是这样就用不着confirm了,没有达到演示confirm的目标。ByteTCC-sample为了演示confirm/cancel调整成这样,作为业务不一定是合理的。业务系统该如何使用TCC需要业务系统自行规划。

另外,对你所问cancel是不是try的反向操作,这个问题回答是肯定的。全局事务回滚的情况下,首先还是依赖本地事务对try操作的回滚。然而,因为全局事务涉及跨库、跨应用操作,全局事务回滚时这些服务的try操作可能已经提交,这时就需要回调他们相应的cancel操作用以回撤其try操作已造成的影响,这是由TCC机制决定的。

kwengelie commented 6 years ago

请问confirm和cancel方法注解在类级别上,若AccountServiceImpl存在两个不同业务的方法需要不同的confirm和cancel时,如何注解?

liuyangming commented 5 years ago

@Compensable上指定的是当前TCC服务的确认&取消逻辑对应的beanId,对于interfaceClass指定接口上的每一个方法,其确认/取消bean上对应方法就是其确认/取消逻辑。