首頁 >後端開發 >Golang >Gorm 事務錯誤 error = 事務已提交或回滾

Gorm 事務錯誤 error = 事務已提交或回滾

WBOY
WBOY轉載
2024-02-10 23:09:07639瀏覽

Gorm 事务错误 error = 事务已提交或回滚

php小編柚子在這篇文章中將為大家介紹一個常見的錯誤訊息:「Gorm 交易錯誤 error = 交易已提交或回滾」。在使用Gorm進行資料庫操作時,有時候會遇到這個錯誤,讓人困惑不解。本文將詳細解釋這個錯誤的原因以及可能的解決方案,幫助讀者解決這個問題,順利進行資料庫操作。

問題內容

我的目標是在下面的程式碼中進行交易管理。如果其中一項策略出現錯誤,我會嘗試回滾。在測試代碼時,我注意到如果回滾或提交命令運行一次,它會給出錯誤=事務已提交或回滾第二次。如何解決此錯誤?

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 事務錯誤 error = 事務已提交或回滾的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除