分布式事务想要达到完全一致性是非常难的, 就算实现了也会丧失分布式的性能.所以分布式事务的方案有多种, 具体要按情况来定, 来取舍.
有些情况, 或许可以尝试使用本地事务实现分布式事务
目前只想到一种:
前提条件, 只跨两个进程的事务, 而且一个事务可以放在另一个事务的末端
即业务需要满足:
TransactionalA(){
first()…
sencond()…
blabla
下面是调用的最后一个方法, 并且是进程间调用(对方也是一个事务)
TransactionalB();
}
分析下,
情况一: B之前失败, 没调用B, B当然正确
情况二: B之后失败, 但目前B之后是没有代码的, 不存在, 除非你切面进行了一些后置方法.如果这些后置方法失败A需要回滚的话, B肯定无法回滚, 但是可能性低
情况三: B失败了, A肯定不会认为B成功, 所以A可定也失败了, 都回滚
情况四: B成功了, A有可能任务他失败了, 比如调用超时, 这时A回滚, B无法回滚, 这个可能性也存在
所以即便满足了B是最后一个方法, 也存在情况二和情况四的不足, 尤其是情况四.
补充: TransactionalB(){}失败 如果A -> B之间 还有一定逻辑 , 要么在事务内, 要么有重试表, 失败重试,最终一致