V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ukipoi
V2EX  ›  问与答

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

  •  
  •   ukipoi · 2019-06-18 11:31:19 +08:00 · 1989 次点击
    这是一个创建于 1764 天前的主题,其中的信息可能已经有所发展或是发生改变。

    两个 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的注解,应该不是配置出错了吧?

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

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

    需要分布式事务了
    luckyrayyy
        7
    luckyrayyy  
       2019-06-18 16:29:59 +08:00
    @Transactional 是方法中间出错了自动回滚,你在另一个方法里调用的话,前一个方法里的事务都完成了,怎么回滚。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5571 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 07:59 · PVG 15:59 · LAX 00:59 · JFK 03:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.