apache / servicecomb-pack

Apache ServiceComb Pack is an eventually data consistency solution for micro-service applications. ServiceComb Pack currently provides TCC and Saga distributed transaction co-ordination solutions by using Alpha as a transaction coordinator and Omega as an transaction agent .
https://servicecomb.apache.org/
Apache License 2.0
1.93k stars 435 forks source link

怎么设置跑出异常的分支事务不补偿通通过本地事务回滚? #669

Open ywdkfz opened 4 years ago

ywdkfz commented 4 years ago

a服务调用b服务,b服务内部异常,希望通过b的本地事务回滚,不用补偿,怎么设置?

WillemJiang commented 4 years ago

使用spring transaction提供的 @transactional 来进行设置。

ywdkfz commented 4 years ago

b方法的补偿方法不需要被调用,实际上调用了,怎么可以让b的补偿方法不调用呢

cmonkey commented 4 years ago

b方法的补偿方法不需要被调用,实际上调用了,怎么可以让b的补偿方法不调用呢

b方法不抛出异常就可以

ywdkfz commented 4 years ago

b方法不跑出异常,a拿到b的结果是失败的要回滚a的本地事务跑出异常回滚a本地事务,结果还是会走b的补偿方法,但b方法实际上已经是失败的,不需要回滚的,还是会走了一次补偿

cmonkey commented 4 years ago

b方法不跑出异常,a拿到b的结果是失败的要回滚a的本地事务跑出异常回滚a本地事务,结果还是会走b的补偿方法,但b方法实际上已经是失败的,不需要回滚的,还是会走了一次补偿

明白你意思了,需要你在b 这个服务的补偿里面做一次校验, 看看传递的globalTxId 是否需要补偿

zhfeng commented 4 years ago

能提供一个完整的例子吗?b服务的本地事务rollback后,omega应该发出TxAbortedEvent。alpha server收到这个消息后,应该是触发补偿操作,发送TxCompensatedEvent给需要做补偿的服务,按说b服务是不会收到这个消息的啊?

ywdkfz commented 4 years ago

b服务也是子事务之一也有补偿方法,b服务也收到了 2FD26A67-43D1-4c20-B225-131EC7D4A972

zhfeng commented 4 years ago

OK, 那这里应该有问题的,b服务不应该再收到TxCompensatedEvent。您有简单的reproducer可以复现这个问题吗?

ywdkfz commented 4 years ago

我是在业务代码上改的,没有单独写的简单demo,我看了下alpha-service的实现,会查出command eventId最大的状态是new的执行补偿的逻辑,全局事务出现异常的时候会把所有的分支事务注册的补偿的方法都去执行,并没有过滤抛出异常的那个子事务不补偿的相关处理

zhfeng commented 4 years ago

Contribution is welcome !