Web サービスに Go を採用するとデータベースとの対話が必要になりますが、go-database-sql.org で提供されているような例は効果的に示していますデータベース操作。ただし、トランザクション ロールバック呼び出しを延期する目的に関してよくある疑問が生じます。
トランザクション ロールバックを延期すると、後続のコード フローに関係なく実行されることが保証されます。これは、早期復帰が発生した場合でも、ロールバックが引き続き行われることを意味します。ただし、注意すべき重要な点は、すでにコミットされたトランザクションで tx.Rollback() を呼び出しても効果がないということです。
defer の動作についてはさらに説明できます。関数が返されると、遅延呼び出しは遅延とは逆の順序で実行されます。これは、 defer tx.Rollback() が err := tx.Commit() の前に実行されることを意味します。
ロールバックを延期することで、コード スニペットは追加の処理の必要性を回避します。条件チェックを実行し、ステートメントの実行中にエラーが発生した場合にトランザクションがロールバックされることを確認します。これにより、コードが簡素化され、適切なデータベース状態管理が保証されます。
遅延の理解に基づいて、提供されたコード スニペットを次のように変更できます:
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() // stmt.Close() runs here!
この変更により、ステートメントの実行中にエラーが発生した場合に tx.Rollback() を実行するという望ましい動作を維持しながら、コードが簡潔に保たれることが保証されます。
以上がGo データベース インタラクションでトランザクションのロールバックに遅延が使用されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。