我一直在使用去一个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你不想在一个真正的应用程序。我建议使用改进此页面按钮并联系作者。 –
谢谢你的回答:) –