为什么要推迟回滚? [英] Why defer a Rollback?

查看:44
本文介绍了为什么要推迟回滚?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经开始将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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆