database/sql에서 트랜잭션이 커밋 또는 롤백되었는지 확인하려면 추가 시도와 그에 따른 오류가 필요합니다. 분석이 불편할 수 있습니다. 하지만 이 프로세스를 최적화하는 것은 가능합니다.
별도의 변수를 유지하거나 트랜잭션 핸들러를 사용
트랜잭션 상태에 대해 별도의 변수를 유지하는 것은 지루할 수 있습니다. 특히 여러 트랜잭션이 있는 함수에서. 대안은 클로저 내에 트랜잭션 관리를 캡슐화하는 트랜잭션 핸들러를 활용하는 것입니다.
func Transact(db *sql.DB, txFunc func(*sql.Tx) error) (err error) { // Begin transaction tx, err := db.Begin() if err != nil { return } // Define a handler for deferring commits or rollbacks defer func() { if p := recover(); p != nil { tx.Rollback() panic(p) } else if err != nil { tx.Rollback() } else { err = tx.Commit() } }() // Execute transaction using the handler err = txFunc(tx) return err }
이 핸들러를 활용하면 트랜잭션을 간결하게 처리할 수 있습니다.
func (s Service) DoSomething() error { return Transact(s.db, func(tx *sql.Tx) error { // Execute statements within the transaction if _, err := tx.Exec(...); err != nil { return err } if _, err := tx.Exec(...); err != nil { return err } return nil }) }
Nil Tx 변수에 대한 GC 메모리 회수
Tx 변수 설정 커밋이나 롤백 후에 nil을 사용하는 것은 바람직하지 않습니다. 가비지 수집기는 닫힌 트랜잭션과 관련된 메모리를 자동으로 회수합니다.
트랜잭션 핸들러에서 패닉 처리
제공된 트랜잭션 핸들러는 Recover()를 사용하여 패닉을 처리하여 즉시 발생하도록 합니다. 롤백 및 코드에서 예상되는 패닉을 포착할 수 있도록 허용합니다. 트랜잭션에 패닉이 발생하는 것을 방지하고 대신 오류 처리를 사용하는 것이 중요합니다.
반환 값에 대한 연기의 영향
트랜잭션 핸들러에서 반환 값은 다음에 의해 영향을 받습니다. 캡처된 변수로 인해 작업이 지연되었습니다. 오류가 발생하지 않으면 커밋이 실행되고(err = tx.Commit()) 롤백은 기존 오류를 보존합니다.
이러한 전략을 구현하면 데이터베이스/SQL의 트랜잭션 처리를 향상하여 명확성과 개선을 보장할 수 있습니다. 오류 감지.
위 내용은 Go의 `database/sql` 패키지에서 데이터베이스 트랜잭션 커밋 또는 롤백을 효율적으로 감지하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!