虽然使用 Go 进行 Web 服务涉及数据库交互,但 go-database-sql.org 中提供的示例有效地展示了数据库操作。然而,关于推迟事务回滚调用的目的,出现了一个普遍的问题。
推迟事务回滚可确保无论后续代码流如何,它都会执行。这意味着即使发生提前返回,回滚仍然会发生。然而,需要注意的一个关键点是,对已经提交的事务调用 tx.Rollback() 没有任何效果。
defer 的行为可以进一步解释。当函数返回时,任何延迟调用都将以与延迟相反的顺序执行。这意味着 defer tx.Rollback() 将在 err := tx.Commit().
通过推迟回滚,代码片段避免了额外的需要条件检查并确保在语句执行期间出现任何错误时回滚事务。这简化了代码并确保正确的数据库状态管理。
基于对 defer 的理解,提供的代码片段可以修改为以下内容:
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() for i := 0; i < 10; i++ { _, err = stmt.Exec(i) if err != nil { log.Fatal(err) } } err = tx.Commit() // stmt.Close() runs here!
此修改可确保代码保持简洁,同时在语句期间出现任何错误时保持执行 tx.Rollback() 的所需行为执行。
以上是Go数据库交互中为什么要使用延迟来进行事务回滚?的详细内容。更多信息请关注PHP中文网其他相关文章!