请教一下, SpringCloud 中,两个通过 api 调用的数据库操作方法,怎么做回滚呢?

2019-06-18 11:31:19 +08:00
 ukipoi

两个 api 返回的都是 自定义的 Result 类型。
Result 类型有一个 isSuccess()

数据库是 mysql,连接数据库的方式是 mybatis 和 mybatis plus

我对 Spring 回滚的方式不是很清楚,是直接调用 dao 的 insert 或者 update 方法出错是,在调用方法里加上@Transactional会自动帮你回滚么?
但是现在 api 不会报错,我就想在第二个 api 判断 isSuccess 失败的时候手动调用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
不过运行的时候报错了

org.springframework.transaction.NoTransactionException: No transaction aspect-managed TransactionStatus in scope

同模块中也有@Transactional的注解,应该不是配置出错了吧?

2171 次点击
所在节点    问与答
7 条回复
wc951
2019-06-18 12:36:25 +08:00
直接抛出一个 runtime 异常就会回滚
reeco
2019-06-18 12:49:57 +08:00
这时候事务都已经结束了,你还 rollback 啥呀
ukipoi
2019-06-18 15:35:11 +08:00
@reeco
那回滚只能在调用 Dao 的时候使用么?
遇到不能直接操作 Dao 的类,只能通过方法的时候该怎么做回滚呢?
mmdsun
2019-06-18 15:54:01 +08:00
加入中间状态,事务补偿。
dyc87112
2019-06-18 16:27:46 +08:00
其实跟 spring cloud 关系不大,主要还是分布式事务的问题。

建议看看这个: https://github.com/seata/seata
telami
2019-06-18 16:28:31 +08:00
两个 api,其实已经是两个子系统了吧,甚至是不同的数据库了,没法回滚。

需要分布式事务了
luckyrayyy
2019-06-18 16:29:59 +08:00
@Transactional 是方法中间出错了自动回滚,你在另一个方法里调用的话,前一个方法里的事务都完成了,怎么回滚。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/575028

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX