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

事务 Propagation 后续是考虑有其它处理吗 #47

Open wujun8 opened 6 years ago

wujun8 commented 6 years ago

这里 org.bytesoft.bytetcc.supports.spring.CompensableMethodInterceptor#execute() 有段代码(点击直达 )

Propagation propagation = transactional == null ? null : transactional.propagation();
if (propagation == null) {
    compensable.registerCompensable(invocation);
} else if (Propagation.REQUIRED.equals(propagation)) {
    compensable.registerCompensable(invocation);
} else if (Propagation.MANDATORY.equals(propagation)) {
    compensable.registerCompensable(invocation);
} else if (Propagation.SUPPORTS.equals(propagation)) {
    compensable.registerCompensable(invocation);
}

看到处理方法都一样,一开始误以为事务传播性还没有实现,才想起 Spring 的事务模块已经提前处理了; 那么,这里这么写是后续考虑对 Propagation 有其它处理吗? 谢谢

liuyangming commented 6 years ago

后续没有特殊处理逻辑。 ByteTCC只将有Required/Mandatory/Supports/RequiresNew的方法添加到TCC事务的服务列表中,是希望开发者明确的使用这些传播级别。其他的传播级别也并非不能使用,只是可能会造成开发者混淆全局事务和本地事务的关系,所以目前版本显式的禁止了。

wujun8 commented 6 years ago

谢谢回复 这里发现一个问题,没有考虑到 RequiresNew

48

liuyangming commented 6 years ago

RequiresNew这个传播级别,spring会为其创建新事务,不和之前的事务数据在一起,所以不必判断。

wujun8 commented 6 years ago

CompensableAnnotationValidator 这里验证只允许 Required/Mandatory/RequiresNew,与 CompensableMethodInterceptor 不匹配,应该也是支持 Supports 的吧

54