为什么要推迟回滚? [英] Why defer a Rollback?
问题描述
我已经开始将Go用作Web服务,并进行了一些数据库交互(惊奇!!!),我发现了以下示例:
I have started using Go for a web-service and have some database interaction (surprise!!!) and I have found this example:
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
该示例格式合理,易于理解.但是,这给我留下了一个未解决的问题.为什么要推迟
事务回滚调用?
The example is well formulated an easy to understand. However, it leaves me with an unanswered question. Why defer
the transaction Rollback call?
为什么不仅要执行以下操作:
Why not just do the following:
err := tx.Commit()
if err != nil {
log.Error(err)
tx.Rollback()
}
推迟tx.Rollback()
是否不总是尝试回滚吗?即使 tx.Commit()
成功了,还是我误解了 defer
的某些内容?
Would defer tx.Rollback()
not always attempt a rollback? Even if tx.Commit()
was a success, or have I misunderstood something about defer
?
推荐答案
该示例有些误导.它使用 log.Fatal(err)
进行错误处理.您通常不会这样做,而是 return err
.因此,可以采用延迟回滚的方式来确保在提前退货的情况下回滚事务.
The example is a little bit misleading. It uses log.Fatal(err)
for error handling. You wouldn't normally do that, and instead return err
. So the deferred rollback is there to ensure that the transaction is rolled back in case of an early return.
这篇关于为什么要推迟回滚?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!