ホームページ > バックエンド開発 > Golang > Go データベース トランザクションでロールバックを延期する必要があるのはなぜですか?

Go データベース トランザクションでロールバックを延期する必要があるのはなぜですか?

Susan Sarandon
リリース: 2024-11-10 14:16:03
オリジナル
216 人が閲覧しました

Why Should You Defer Rollback in Go Database Transactions?

ロールバックの延期の必要性を理解する

Go for Web サービスを使用してデータベースと対話する場合、トランザクションを効果的に管理することが不可欠です。トランザクションの遅延 Rollback 呼び出しは、コードを簡素化し、データの整合性を確保する上で重要な役割を果たします。

Go データベース/SQL ドキュメントの次のコード スニペットを検討してください。

tx, err := db.Begin()
if err != nil {
    log.Fatal(err)
}
defer tx.Rollback()
stmt, err := tx.Prepare("INSERT INTO foo VALUES (?)")
if err != nil {
    log.Fatal(err)
}
defer stmt.Close()
for i := 0; i < 10; i++ {
    _, err = stmt.Exec(i)
    if err != nil {
        log.Fatal(err)
    }
}
err = tx.Commit()
if err != nil {
    log.Fatal(err)
}
ログイン後にコピー

添付された defer ステートメントtx.Rollback() 呼び出しに追加すると、tx.Commit() 呼び出し前にエラーが発生した場合にトランザクションがロールバックされることが保証されます。しかし、疑問が生じます。なぜ単純に tx.Commit() の後でエラーを処理し、明示的に tx.Rollback() を呼び出さないのでしょうか?

err := tx.Commit()
if err != nil {
    log.Error(err)
    tx.Rollback()
}
ログイン後にコピー

このアプローチは論理的に見えますが、defer の重要な側面を見落としています。 .

Defer の力

Go の defer キーワードは、関数呼び出しが確実に実行されるようにします。エラーが発生した場合、または関数が return ステートメントによって早期に終了した場合でも、関数の終了。この動作は、データベース トランザクションのコンテキストで特に価値があります。

tx.Rollback() 呼び出しを延期することで、エラー処理ロジックを簡素化できます。 tx.Commit() が呼び出される前にエラーが発生した場合、defer ステートメントにより、エラーの場所に関係なく、トランザクションが確実にロールバックされます。

逆に、tx の後にエラーを処理すると、 .Commit()、エラーが発生した場合は手動で tx.Rollback() を呼び出す必要があります。このアプローチでは、さらに複雑なレイヤーが追加され、ロールバック呼び出しを誤って省略するリスクが増加します。

コミットされたトランザクションのコミット

考慮すべきもう 1 つの重要な点は、コミットされたトランザクションで tx.Rollback() を呼び出すことです。トランザクションは効果がありません。トランザクションがコミットされると、ロールバックすることはできません。

この動作により、tx.Commit() の後に defer tx.Rollback() が呼び出された場合でも、トランザクションはロールバックされません。これは、成功したトランザクションを誤って元に戻すことを恐れることなく、ロールバック呼び出しを延期できることを意味します。

結論

トランザクションのロールバック呼び出しを Go で延期すると、エラー処理の簡素化、ロールバックの保証など、いくつかの利点が得られます。エラーの場合と、コミットされたトランザクションの偶発的なロールバックに対する保護。これは、クリーンで信頼性の高いコードを促進する強力な手法です。

以上がGo データベース トランザクションでロールバックを延期する必要があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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