mysql - 我必须在 *sql.Tx.Rollback() 调用之前调用 *sql.Rows.Close() 吗?
问题描述
当我使用sql
golang的包时,如果我在事务中进行查询,并且在调用时遇到错误,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()
即使跳过内部事务也没关系
当事务有提交或回滚时,行将被事务上下文关闭。
推荐阅读
- python - 要根据随机输入字母在字典中查找单词,这段代码会高效执行吗?
- c# - 为什么 protobuf-net 反序列化的 DataType 对象不显示 Enum 值?
- jenkins - 根据投票结果构建 Jenkins Job
- android - 5 英寸设备从 sw320dp 获取尺寸,而不是 sw480dp
- assembly - 16 位汇编:不能取消引用某些寄存器
- sql - 该索引是否有用?
- javascript - 主线程忙时可以进行垃圾收集吗?
- django-rest-framework - 使用 @api_view FBV 接收 url 参数
- linux - 如何在 nslcd.service 之后启动 docker.service?
- jquery - 如何从 id 变量中获取 jquery element-object parent