Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dubbo事务补偿问题 #223

Closed
airbaby opened this issue Jul 17, 2018 · 9 comments
Closed

Dubbo事务补偿问题 #223

airbaby opened this issue Jul 17, 2018 · 9 comments

Comments

@airbaby
Copy link

airbaby commented Jul 17, 2018

A系统调用B系统服务,A系统调用C系统服务, Saga-0.2.0版本;
1、A-B调用返回成功;
2、A-C调用返回失败;
出现问题:
B执行完后,C事务中断,C并“没有”调用自身补偿方法进行补偿,A也没有调用方法进行补偿?使用提供的Dubbo示例加入如下代码,也是同样的结果;

@SagaStart
@Compensable(compensationMethod="cancel")
@transactional(rollbackFor = Exception.class)
public void transfer(String from, String to, BigDecimal amount){
//B服务Dubbo调用
transBDubboService.transferBIn(to, 50);
//C服务Dubbo调用
transCDubboService.transferCIn(to, 50);
}

//B服务Dubbo接口方法
@Compensable(compensationMethod="cancel")
@transactional(rollbackFor = Exception.class)
@OverRide
public void transferBIn(String to, int amount) {
LOG.info("C.Called,开始转入资金:"+amount);
AccountPo accountPo= accountPoDao.queryByUserName(to);
LOG.info("C.Called,开始转入资金:"+amount);
//转入资金操作
accountPo.setBalance(accountPo.getBalance().add(BigDecimal.valueOf(amount)));
accountPoDao.updateByCond(accountPo);
}

//C服务Dubbo接口方法
@Compensable(compensationMethod="cancel")
@transactional(rollbackFor = Exception.class)
@OverRide
public void transferCIn(String to, int amount) {
LOG.info("C.Called,开始转入资金:"+amount);
AccountPo accountPo= accountPoDao.queryByUserName(to);
//转入资金操作
accountPo.setBalance(accountPo.getBalance().add(BigDecimal.valueOf(amount)));
accountPoDao.updateByCond(accountPo);
}

//B和C服务补偿方法
public void cancel(String to, int amount) {
    LOG.info("Called Cancel 开始取消转入转款:"+amount);
    AccountPo accountPo= accountPoDao.queryByUserName(to);
      //补偿,取消转入
     accountPo.setBalance(accountPo.getBalance().subtract(BigDecimal.valueOf(amount)));
     accountPoDao.updateByCond(accountPo);
    LOG.info("Called Cancel 补偿成功");
}

1531803341 1

@airbaby airbaby changed the title 您好,请问一个Dubbo事务补偿问题 Dubbo事务补偿问题 Jul 17, 2018
@WillemJiang
Copy link
Member

请问C事务中断是抛异常吗?因为你使用了@transactional, 如果服务抛异常, 对应的数据库提交动作就不会执行。 不调用C的补偿方法是正确的。 但是B的补偿方法是需要调用的, 这个在Dubbo示例的代码里面是能够正常执行的。 https://github.com/apache/incubator-servicecomb-saga/blob/master/acceptance-tests/acceptance-pack-dubbo-demo/src/test/resources/CExceptionWhenAbAc_scenario.feature

@airbaby
Copy link
Author

airbaby commented Jul 17, 2018 via email

@WillemJiang
Copy link
Member

我们的验收测试用的是dubbo 2.6.1, 你看看能不升级一下。
还有你有没有试过 A-B, A最后抛出异常,看看B有没有回滚。

如果B能回滚,就需要确保调C出错的时候,异常能够在A方法中抛出。

@airbaby
Copy link
Author

airbaby commented Jul 17, 2018 via email

@WillemJiang
Copy link
Member

WillemJiang commented Jul 17, 2018

感觉你是用了MySQL的主从复制功能,这种情况下JPA创建临时表不能同步复制。

@WillemJiang
Copy link
Member

@airbaby Is there any update of this issue?

@airbaby
Copy link
Author

airbaby commented Aug 8, 2018 via email

@WillemJiang
Copy link
Member

这的确是个好消息, 现在系统已经投入生产了吗?
欢迎加入到Saga项目开发中来。

@WillemJiang
Copy link
Member

Just close the issue as it is resolved.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants