Rails 一个旧项目升级到 rails7,代码中的事务部分竟然跳过不执行了?

stephen · 2024年12月29日 · 最后由 koell 回复于 2024年12月30日 · 228 次阅读

一个旧项目升级到 rails7,代码中的事务部分竟然跳过不执行了?难道还有什么开关设置? 数据库是 mysql,模式是 InnoDB

begin
      puts 0
      ActiveRecord::Base.transaction do
        puts 0
        a = dish_order.update!(status: :checkouted, pay_at: DateTime.now, payment_method: :abpay)
        ......
        render json: { code: 0, message: '支付成功', data: { } }, status: :ok and return
      end
    rescue => e
      render json: { code: 1, message: e, data: {} }, status: :ok and return
    end

Rails 7 里事务中有 return 会直接回滚

7.x 有一个选项 config.active_record.commit_transaction_on_non_local_return 可以控制是提交还是回滚,不过这个选项在 8.0 删除了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号