登录
首页 >  Golang >  Go问答

Gorm 事务错误:已无法回滚或提交事务

来源:stackoverflow

时间:2024-02-11 17:09:18 401浏览 收藏

在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是Golang学习者,那么本文《Gorm 事务错误:已无法回滚或提交事务》就很适合你!本篇内容主要包括##content_title##,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我的目标是在下面的代码中进行事务管理。如果其中一项策略出现错误,我会尝试回滚。在测试代​​码时,我注意到如果回滚或提交命令运行一次,它会给出错误=事务已被提交或回滚第二次。如何解决此错误?

func (d *DistributeService) Distribute(vehicleNumberPlate string, request model.DistributeRequest) (*model.DistributeResponse, error) {
    var response model.DistributeResponse
    response.Vehicle = vehicleNumberPlate
    var routeList []model.RouteResponse
    tx := d.repo.BeginTransaction()
    for _, routes := range request.RouteRequest {
        var routeResponse model.RouteResponse
        strategy, isStrategyExists := d.strategies[routes.DeliveryPoint]
        if isStrategyExists {
            resp, err := strategy.Distribute(routes.Deliveries, vehicleNumberPlate, tx)
            if err != nil {
                tx.Rollback()
                logrus.Errorf("Error while distributing: %v", err)
                return nil, err
            }
            routeResponse.DeliveryPoint = routes.DeliveryPoint
            routeResponse.Deliveries = *resp
            routeList = append(routeList, routeResponse)
        } else {
            logrus.Errorf("Invalid delivery point: %v", routes.DeliveryPoint)
            return nil, errors.New("invalid delivery point")
        }
    }
    response.RouteResponse = routeList
    err := d.checkSackPackagesAreUnloaded()
    tx.Commit()
    if err != nil {
        return nil, err
    }
    return &response, nil
}

正确答案


您可能在每次调用中使用相同的事务对象。 如果它被关闭一次 - 无论出于何种原因 - 您需要创建一个新的事务对象。

为什么我说您可能使用您询问的相同事务对象? 因为您基本上将指针传递给 d *DistributeService。 然后使用 tx := d.repo.BeginTransaction()。我们无法判断该代码的作用,但我很确定您将在此处返回相同的事务对象以供后续运行。

解决方案是每次调用此方法时创建一个新的事务对象,例如使用 tx := db.Begin(),如 文档 中所述。

终于介绍完啦!小伙伴们,这篇关于《Gorm 事务错误:已无法回滚或提交事务》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>