雖然使用 Go 進行 Web 服務涉及資料庫交互,但 go-database-sql.org 中提供的範例有效地展示了資料庫操作。然而,關於推遲事務回滾呼叫的目的,出現了一個普遍的問題。
延遲事務回滾可確保無論後續程式碼流如何,它都會執行。這意味著即使發生提前返回,回滾仍然會發生。然而,需要注意的一個關鍵點是,對已經提交的事務呼叫 tx.Rollback() 沒有任何效果。
defer 的行為可以進一步解釋。當函數返回時,任何延遲呼叫都將以與延遲相反的順序執行。這意味著defer tx.Rollback() 將在err := tx.Commit().
透過延遲回滾,程式碼片段避免了額外的需要條件檢查並確保在語句執行期間出現任何錯誤時回溯交易。這簡化了程式碼並確保正確的資料庫狀態管理。
基於對defer 的理解,提供的程式碼片段可以修改為以下內容:
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中文網其他相關文章!