Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ralat ralat transaksi Gorm = urus niaga dilakukan atau dibatalkan

Ralat ralat transaksi Gorm = urus niaga dilakukan atau dibatalkan

WBOY
WBOYke hadapan
2024-02-10 23:09:07624semak imbas

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

editor php Youzi akan memperkenalkan anda kepada mesej ralat biasa dalam artikel ini: "Ralat ralat transaksi Gorm = transaksi telah dilakukan atau dibatalkan". Apabila menggunakan Gorm untuk operasi pangkalan data, anda kadangkala menghadapi ralat ini, yang mengelirukan. Artikel ini akan menerangkan punca ralat ini dan kemungkinan penyelesaian secara terperinci untuk membantu pembaca menyelesaikan masalah ini dan melaksanakan operasi pangkalan data dengan lancar.

Kandungan soalan

Matlamat saya adalah untuk melakukan pengurusan transaksi dalam kod di bawah. Jika ada masalah dengan salah satu strategi, saya cuba berpatah balik. Semasa menguji kod, saya perhatikan bahawa jika perintah rollback atau commit dijalankan sekali, ia memberikan ralat = transaksi telah dilakukan atau digulung semula untuk kali kedua. Bagaimana untuk membetulkan ralat ini?

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
}

Penyelesaian

Anda mungkin menggunakan objek transaksi yang sama dalam setiap panggilan. Jika ia ditutup sekali - atas sebab apa pun - anda perlu mencipta objek transaksi baharu.

Mengapa saya katakan anda mungkin menggunakan objek transaksi yang sama yang anda tanyakan? Kerana anda pada asasnya menghantar penunjuk kepada d *DistributeService. Kemudian gunakan tx := d.repo.BeginTransaction(). Kami tidak dapat memberitahu apa yang dilakukan oleh kod ini, tetapi saya agak pasti anda memulangkan objek transaksi yang sama di sini untuk larian berikutnya.

Penyelesaian adalah untuk mencipta objek transaksi baharu setiap kali kaedah ini dipanggil, mis. tx := db.Begin()

Atas ialah kandungan terperinci Ralat ralat transaksi Gorm = urus niaga dilakukan atau dibatalkan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam