Gorm 트랜잭션 오류 오류 = 트랜잭션 커밋 또는 롤백

WBOY
풀어 주다: 2024-02-10 23:09:07
앞으로
621명이 탐색했습니다.

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

php 편집기 Youzi는 이 문서에서 "Gorm 트랜잭션 오류 오류 = 트랜잭션이 커밋되거나 롤백되었습니다"라는 일반적인 오류 메시지를 소개합니다. 데이터베이스 작업에 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 트랜잭션 오류 오류 = 트랜잭션 커밋 또는 롤백의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:stackoverflow.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!