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 중국어 웹사이트의 기타 관련 기사를 참조하세요!