首页 > 解决方案 > 我必须在 *sql.Tx.Rollback() 调用之前调用 *sql.Rows.Close() 吗?

问题描述

当我使用sqlgolang的包时,如果我在事务中进行查询,并且在调用时遇到错误,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
}

标签: mysqlgo

解决方案


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

代码在这里

rows.Close()即使跳过内部事务也没关系

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


推荐阅读