我一直在使用去一個web服務起步,並沒有一些數據庫交互(驚喜!),我發現這個例子:爲什麼推遲迴滾?
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() // danger!
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)
}
// stmt.Close() runs here!
從http://go-database-sql.org/prepared.html
的例子很好地制定了一個簡單的瞭解。但是,這給我留下了一個沒有答案的問題。爲什麼defer
事務回滾調用?
爲什麼不只是做到以下幾點:
err := tx.Commit()
if err != nil {
log.Error(err)
tx.Rollback()
}
將defer tx.Rollback()
並不總是試圖回滾?即使tx.Commit()
是成功的,或者我誤解了defer
的一些內容?
看起來像一個錯誤。正如你所說,除非發生錯誤,否則你不想回滾。另外log.Fatalf你不想在一個真正的應用程序。我建議使用改進此頁面按鈕並聯系作者。 –
謝謝你的回答:) –