> 백엔드 개발 > Golang > 오류 없이 데이터베이스/SQL 트랜잭션의 상태를 안전하게 확인할 수 있는 방법은 무엇입니까?

오류 없이 데이터베이스/SQL 트랜잭션의 상태를 안전하게 확인할 수 있는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-12-12 22:47:18
원래의
297명이 탐색했습니다.

How Can I Safely Determine the Status of a database/sql Transaction Without Errors?

database/sql Tx: Detecting Transaction Status

질문:

어떻게 확인할 수 있나요? 데이터베이스/SQL을 사용하는 트랜잭션이 커밋되었는지 또는 트리거 없이 롤백되었는지 여부 오류가 발생했나요?

답변:

거래 상태를 감지하려면 다음 모범 사례를 따르세요.

1. 함수 내에서 트랜잭션 유지:

Begin(), Commit() 및 Rollback()이 동일한 함수 내에서 호출되는지 확인하세요. 이를 통해 거래가 원활하게 추적될 수 있습니다.

2. 트랜잭션 종료를 위해 연기 활용:

필요한 경우 롤백을 수행하는 연기 기능을 통합합니다. 이를 통해 올바른 거래 처리가 보장됩니다.

3. 간결성을 위한 트랜잭션 핸들러:

트랜잭션을 캡슐화하여 간결성과 적절한 처리를 보장하는 트랜잭션 핸들러 기능을 구현합니다.

코드 예:

import "database/sql"

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)
        } else if err != nil {
            tx.Rollback()
        } else {
            err = tx.Commit()
        }
    }()
    err = txFunc(tx)
    return err
}
로그인 후 복사

거래 이용 handler:

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
    })
}
로그인 후 복사

패닉 처리:

recover()를 사용하여 패닉을 포착하고 시기적절한 롤백을 보장합니다. 예상되는 경우 처리를 허용하도록 패닉을 다시 발생시킵니다.

GC 및 Tx 개체:

커밋 또는 롤백 후에 Tx를 nil로 설정해도 메모리가 자동으로 확보되지 않습니다. . 대신 가비지 수집기에 의존하여 이 문제를 처리하세요.

위 내용은 오류 없이 데이터베이스/SQL 트랜잭션의 상태를 안전하게 확인할 수 있는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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