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中文網其他相關文章!