database/sql Tx: トランザクション ステータスの検出
質問:
どうやって判断できますかデータベース/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 中国語 Web サイトの他の関連記事を参照してください。