no valid transaction

来源:5-23 服务管理 - 更新HTTP服务接口开发 - 数据入库

脚扶拖拉机

2020-12-16

老师您好,我目前学到更新HTTP服务接口的位置,问题是这样的:

我的更新接口在服务器启动后,第一次是能够更新成功的,但是再次更新后会一直失败,我想因该是第一次更新后我们拿到的*gorm.DB这个句柄出现了异常,因为我们每次操作数据库都要去获得这个东西,第一次出了问题之后,以后再次获取依然会出问题。

然后经过debug,我发现在服务器启动第一次更新数据的时候,会在tx.Commit()的地方出现问题,点进去之后是commit的逻辑:

http://img.mukewang.com/szimg/5fd9d092095e432a13880794.jpg

红色框中的地方应该是对 s.db 的一个类型转换,我的判断是这里出现了错误。

但是到了这里我没有继续的思路了,望老师指点。


一些额外的补充,代码结构是这样的:

func (service *ServiceController) ServiceUpdateHTTP(c *gin.Context) {
  params := &dto.ServiceUpdateHTTPInput{}  

    //。。。

  db, err := lib.GetGormPool("default")
  if err != nil {
     middleware.ResponseError(c, 2002, err)
     return
  }

  db.Begin()

    //。。。


  db.Commit()
  middleware.ResponseSuccess(c, "update successfully!")
}

另外:第一次更新是能成功的,数据也能更新到数据库,但是第一次commit后,操作数据库的句柄被标记了一个错误,后面就无法再使用了

写回答

1回答

牛儿吃草

2021-01-02

初步认定为:db执行begin后未完成事务闭合操作引起的。

所以在db.begin后面,凡是controller一层return的操作,统统需要检查有没有执行db.commit或者db.rollback操作。一定要注意,不然其他操作都会受影响的。
相当于这个db连接池再获取时还是那个未关闭的连接。

0
1
秋叶原的黑猫
非常感谢老师!出现了同样问题,已解决
2021-10-07
共1条回复

(打造简历金牌项目)Vue+Go 开发企业级微服务网关项目

简历中摒弃烂大街的培训机构项目,带你开发企业级微服务网关

1316 学习 · 352 问题

查看课程

相似问题