现象

web服务有个接口,service层开启事务,调用dao层两个接口。发现第二个dao层接口返回Error,在service层事务回滚时panic,该panic无法被recover。

代码详情

事务中有两条sql,第一条调用Rows查询,第二条普通查询,代码如下:

func TestGorm(db *gorm.DB) ([]*User, error) {tx := db.Begin()//第1条SQLrows, err := tx.Table("user").Select("max(age) as max_age").Rows()if err != nil {tx.Rollback()return nil, err}var maxAge int8if rows.Next() {err = rows.Scan(&maxAge)if err != nil {tx.Rollback()return nil, err}}//TAG rows没有closevar users []*User//第2条SQLtx = tx.Table("user").Where("age = ?", maxAge).Find(&users)if tx.Error != nil {//此处回滚tx.Rollback()return nil, tx.Error}db.Commit()return users, nil
}

日志

1. 第二条SQL执行失败,tx.Error为driver: bad connection,并打印如下日志

[mysql] 2021/12/30 13:59:22 packets.go:445: busy buffer

2.  执行tx.Rollback()时panic,日志如下:

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x78 pc=0x16f7f3f]

goroutine 100 [running]:
code.byted.org/gopkg/mysql-driver.sqlAfter(0xc0004ea340, 0x0, 0x0)
    /Users/bytedance/go/pkg/mod/code.byted.org/gopkg/mysql-driver@v1.2.1/middleware.go:66 +0x3f
code.byted.org/gopkg/mysql-driver.(*mysqlStmt).query.func1.1()
    /Users/bytedance/go/pkg/mod/code.byted.org/gopkg/mysql-driver@v1.2.1/statement.go:130 +0x3b
code.byted.org/gopkg/mysql-driver.(*mysqlStmt).QueryContext.func1()
    /Users/bytedance/go/pkg/mod/code.byted.org/gopkg/mysql-driver@v1.2.1/connection_go18.go:152 +0x4b
code.byted.org/gopkg/mysql-driver.(*mysqlRows).Close(0xc0004f2780, 0x0, 0x0)
    /Users/bytedance/go/pkg/mod/code.byted.org/gopkg/mysql-driver@v1.2.1/rows.go:70 +0x134
database/sql.(*Rows).close.func1()
    /usr/local/go/src/database/sql/sql.go:3178 +0x3c
database/sql.withLock(0x19912c0, 0xc0001c6000, 0xc000502700)
    /usr/local/go/src/database/sql/sql.go:3294 +0x69
database/sql.(*Rows).close(0xc000167300, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/database/sql/sql.go:3177 +0x114
database/sql.(*Rows).awaitDone(0xc000167300, 0x19994a8, 0xc0004e8700, 0x19994a8, 0xc000334040)
    /usr/local/go/src/database/sql/sql.go:2831 +0xd4
created by database/sql.(*Rows).initContextClose
    /usr/local/go/src/database/sql/sql.go:2815 +0xc9

原因

rows会维护这个数据库连接,当 tx 想再次调用当前连接进行数据库操作的时候,因为连接还没有断开,没有调用 rows.Close(),tx 无法再从连接池里获取当前连接。参考:Golang 报错 | 操作mysql提示busy buffer_MyBlog-CSDN博客

解决方法

在“//TAG rows没有close”行增加“rows.Close()”

gorm踩坑 事务中Row/Rows未关闭导致panic相关推荐

  1. Do not use “@ts-ignore“ because it alters compilation errors(ts严格模式未关闭导致的项目启动失败的解决方案)

    ts严格模式未关闭导致的项目启动失败解决方案 项目场景: 问题描述: 原因分析: 解决方案: 项目场景: 用ts搭建vue项目的时候用@ts-ignore来避免报错,结果编译时仍然出错导致无法启动服务 ...

  2. go nil json.marshal 完是null_字节跳动踩坑记#3:Go服务灵异panic

    这个坑比较新鲜,刚填完,还冒着冷气. - 1 - 在字节跳动,我们服务的所有 log 都通过统一的日志库采集到流式日志服务.落地 ES 集群,配上字节云超(sang)级(xin)强(bing)大(ku ...

  3. zookeeper启动失败的排错 no route to host 防火墙未关闭导致的

    1.执行zkServer.sh start 后显示: JMX enabled by default Using config:/home/Hadoop/app/zookeeper-3.4.5/bin/ ...

  4. 批量下载文件,循环中文件流没有关闭导致每次下载会累加之前的下载文件

    /*** 压缩** @param files 多文件* @param zipFilePath 目标压缩文件路径* @throws IOException*/ public static void zi ...

  5. InstallShield SdShowMsg未关闭导致安装程序无法停止

    strMsg="hehe"; SdShowMsg(strMsg,true);//显示消息 -- SdShowMsg(strMsg,false);//关闭消息 SdShowMsg后要 ...

  6. ReactNative 在丁香医生项目中引入的踩坑日记

    ReactNative 在丁香医生项目中引入的踩坑日记 this没绑定到函数导致空指针 参考 React-Native 踩坑第二弹-undefined is not a function(evalua ...

  7. [踩坑]packets.go:428: busy buffer invalid connection

    最近在写一个导出数据库数据的小工具,但是发现对于超大表,就会包开头提到的错误.结论就是我们使用的go-sql-driver里面的rows查询类似一个游标,但是mysql中有超时查询时间,这个时间到了 ...

  8. OrangePi PC 玩Linux主线内核踩坑之旅(一)之制作第一个镜像

    今天开始写一个专题<OrangePi PC 玩Linux主线内核>.一方面是记录自己在踩坑过程中的点点滴滴,另一方面是分享自己的心得.目前还不确定要写几期,希望大家多多捧场. 首先简单介绍 ...

  9. 【MathType安装】Office2019+MathType7.4.8.0+踩坑记录+最终使用方案

    使用Office2019安装MathType7.4.8.0屡屡碰壁,最终使用的解决方案不同于网络上的大多数方法.尽管当前记录的解决方案还不完美.未做到一劳永逸,但能用就行. MathType安装包获取 ...

最新文章

  1. url的三个js编码函数escape(),encodeURI(),encodeURIComponent()简介【转】
  2. OpenCV向Facemark API添加新算法
  3. c语言字母输出什么意思,C语言中字符的输入输出以及计算字符个数的方法详解...
  4. Qt中的模态对话框和非模态对话框
  5. 这张磁盘有写保护_架构师不得不了解的硬件知识 - 磁盘阵列RAID
  6. 设置jstree只展示到2级_你做的私域流量属于什么级别?80%的商家都还只在第2级...
  7. 报错盲注之exp注入(double数值类型溢出原理详解)
  8. centos手动增加删除swap分区
  9. fms +fme 视频直播
  10. 翱文中华灯谜大全 v1.1 免费下载--IT man
  11. 迅歌点歌系统服务器过期或不信任怎么办,点歌机常见问题解析
  12. asio几种异步编程模型
  13. Linux安装及管理程序
  14. asp.net+sqlserver个人简历生成系统C#项目
  15. matlab eiq函数,Matlab学习笔记(9)——textread函数
  16. 基于CIM的智慧城市建设
  17. matlab消除多重共线性,多重共线性问题的几种解决方法-解决多重共线性的方法...
  18. Pseudo-terminal will not be allocated because stdin is not a terminal
  19. python中数字加引号和不加引号的区别_高考完小白自学Python,不太懂print语句中一个加引号,一个不加?...
  20. 如何用matlab画旋转面,基于MATLAB在旋转面及其方程教学中应用的教学设计

热门文章

  1. FileSaver结合XLSX实现el-table的分页数据导出
  2. 【大数据day02】——Linux系统02(find 搜索,VI编辑器_终端编辑器,用户权限相关命令,系统信息相关命令)
  3. 欧陆战争5设备系统时间与服务器时间不一致,欧陆战争5怎么调整时间bug
  4. .NET 6 出现在 Ubuntu 上——但 Linux 的 MAUI 在哪里?
  5. mysql 基本语句 (烂笔头)
  6. bootstrap 检验 法 原理_广义倾向得分匹配法(GPS)(二)
  7. 22CCPC威海+思维
  8. UE4和VR的项目流程(新手经验)
  9. 计算机Intel CPU体系结构分析
  10. 关于Unity的回放功能