我必须在调用* sql.Tx.Rollback()之前调用* sql.Rows.Close()吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我必须在调用* sql.Tx.Rollback()之前调用* sql.Rows.Close()吗?相关的知识,希望对你有一定的参考价值。

当我使用golang的sql包时,如果我在事务中进行查询,并且在调用rows.Scan()时遇到错误,那么在此之后我应该首先调用哪个方法? *sql.Tx.Rollback()*sql.Rows.Close()?目前我在*sql.Rows.Close()之前打电话给*sql.Tx.Rollback(),但我想知道,如果我改变这个命令将会发生什么?

tx, err := db.Begin()
if err != nil {
    ... // handle error
}


rows, err := tx.Query("sqlstmt")
if err != nil {
    ... // handle error
}


defer rows.Close() // can I use defer at this place, though it will be called after tx.Rollback()?


if err := rows.Scan(vars...); err != nil {
    if e := tx.Rollback(); e != nil {
        log(e)
        return e
    }
    return err
}
答案

https://go-review.googlesource.com/c/go/+/44812/

代码在这里

即使在交易中跳过rows.Close()也没关系

当事务具有提交或回滚时,行将由事务上下文关闭。

以上是关于我必须在调用* sql.Tx.Rollback()之前调用* sql.Rows.Close()吗?的主要内容,如果未能解决你的问题,请参考以下文章

我必须在 NSManagedObject didTurnIntoFault 中调用 super 吗?

为啥必须在 componentDidMount() 期间解析函数中的函数调用?

Swift UnsafeMutablePointer:我必须在释放之前调用 deinitialize 吗?

我必须在 onCreate 中调用 (admob) loadAd 吗?

为啥我必须在析构函数中调用 MPI.Finalize() ?

为啥我必须显式调用我的库?