データベース/SQL で、トランザクションがコミットされたかロールバックされたかを識別するには、追加の試行とその後のエラーが必要です不便な場合がある分析。ただし、このプロセスを最適化することは可能です。
個別の変数の維持またはトランザクション ハンドラーの使用
トランザクション状態の個別の変数の維持は、特に面倒な場合があります。複数のトランザクションを伴う関数内。別の方法は、クロージャ内にトランザクション管理をカプセル化するトランザクション ハンドラーを利用することです:
func Transact(db *sql.DB, txFunc func(*sql.Tx) error) (err error) { // Begin transaction tx, err := db.Begin() if err != nil { return } // Define a handler for deferring commits or rollbacks defer func() { if p := recover(); p != nil { tx.Rollback() panic(p) } else if err != nil { tx.Rollback() } else { err = tx.Commit() } }() // Execute transaction using the handler err = txFunc(tx) return err }
このハンドラーを利用すると、トランザクションを簡潔に処理できます:
func (s Service) DoSomething() error { return Transact(s.db, func(tx *sql.Tx) error { // Execute statements within the transaction if _, err := tx.Exec(...); err != nil { return err } if _, err := tx.Exec(...); err != nil { return err } return nil }) }
Nil Tx 変数の GC メモリ再利用
設定コミットまたはロールバック後に Tx 変数を nil にすることはお勧めできません。ガベージ コレクターは、閉じられたトランザクションに関連付けられたメモリを自動的に再利用します。
トランザクション ハンドラーでのパニックの処理
提供されたトランザクション ハンドラーは、recover() を使用してパニックを処理し、即時性を確保します。ロールバックし、コードが予想されるパニックをキャッチできるようにします。トランザクションにパニックが発生するのを避け、代わりにエラー処理を使用することが重要です。
戻り値に対する遅延の影響
トランザクション ハンドラーでは、戻り値は次の影響を受けます。キャプチャされた変数による遅延操作。エラーが発生しない場合 (err = tx.Commit())、コミットは実行されますが、ロールバックは既存のエラーを保持します。
これらの戦略を実装することで、データベース/SQL でのトランザクション処理を強化し、明確さと改善を保証できます。エラー検出。
以上がGo の「database/sql」パッケージでデータベース トランザクションのコミットまたはロールバックを効率的に検出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。