2017-09-26 36 views
0

我一直在使用去一個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的一些內容?

+0

看起來像一個錯誤。正如你所說,除非發生錯誤,否則你不想回滾。另外log.Fatalf你不想在一個真正的應用程序。我建議使用改進此頁面按鈕並聯系作者。 –

+0

謝謝你的回答:) –

回答

1

這個例子有點讓人誤解。它使用log.Fatal(err)進行錯誤處理。你通常不會這樣做,而是return err。所以延遲迴滾就是爲了確保事務在提前返回的情況下回滾。

+0

是的,我知道log.Fatal部分:)非常感謝你的回答 –