ホームページ > バックエンド開発 > Golang > データベース/SQL トランザクションのステータスをエラーなく安全に判断するにはどうすればよいですか?

データベース/SQL トランザクションのステータスをエラーなく安全に判断するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-12 22:47:18
オリジナル
298 人が閲覧しました

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

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート