> 백엔드 개발 > Golang > Go의 `database/sql` 패키지에서 데이터베이스 트랜잭션 커밋 또는 롤백을 어떻게 안정적으로 감지할 수 있나요?

Go의 `database/sql` 패키지에서 데이터베이스 트랜잭션 커밋 또는 롤백을 어떻게 안정적으로 감지할 수 있나요?

Patricia Arquette
풀어 주다: 2024-12-22 18:44:11
원래의
585명이 탐색했습니다.

How Can I Reliably Detect Database Transaction Commit or Rollback in Go's `database/sql` Package?

database/sql에서 Transaction Commit 또는 Rollback 감지

드라이버 인터페이스와 Tx 유형이 있는 Database/sql 패키지에서는 그렇지 않습니다. 다른 트랜잭션을 시도하지 않고도 트랜잭션이 커밋되었는지 또는 롤백되었는지 여부를 확인할 수 있습니다. 그런 다음 후속 시도에서 반환된 오류를 검사하여 트랜잭션 상태를 추론할 수 있습니다.

추가 오버헤드를 방지하려면 커밋 또는 롤백 후에 Tx 변수를 nil로 설정하는 것이 좋습니다. 그러나 이 접근 방식은 예기치 않은 동작과 메모리 누수를 일으킬 수 있으므로 일반적으로 권장되지 않습니다.

권장되는 솔루션은 트랜잭션 핸들러를 사용하여 트랜잭션 논리를 래핑하는 것입니다. 이렇게 하면 Begin(), Commit() 및 Rollback() 호출이 항상 동일한 함수 내에 있으므로 추적이 단순화되고 defer 문을 사용하여 적절한 트랜잭션 처리가 보장됩니다.

예:

func Transact(db *sql.DB, txFunc func(*sql.Tx) error) (err error) {
    tx, err := db.Begin()
    if err != nil {
        return
    }
    defer func() {
        if p := recover(); p != nil {
            tx.Rollback()
            panic(p) // re-throw panic after Rollback
        } else if err != nil {
            tx.Rollback() // err is non-nil; don't change it
        } else {
            err = tx.Commit() // err is nil; if Commit returns error update err
        }
    }()
    err = txFunc(tx)
    return err
}
로그인 후 복사

이 핸들러를 사용하면 트랜잭션 로직을 다음과 같이 캡슐화할 수 있습니다.

func (s Service) DoSomething() error {
    return Transact(s.db, func (tx *sql.Tx) error {
        if _, err := tx.Exec(...); err != nil {
            return err
        }
        if _, err := tx.Exec(...); err != nil {
            return err
        }
        return nil
    })
}
로그인 후 복사

이 접근 방식은 트랜잭션 코드를 간결하게 유지하고 일관된 처리를 보장합니다. 트랜잭션 핸들러는 복구()를 사용하여 패닉을 차단하고 즉시 롤백을 시작한다는 점에 유의하십시오. 그러나 당황하는 것보다 오류를 반환하는 것이 더 선호된다는 점을 강조해야 합니다.

위 내용은 Go의 `database/sql` 패키지에서 데이터베이스 트랜잭션 커밋 또는 롤백을 어떻게 안정적으로 감지할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿