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

脚扶拖拉机
2020-12-16
老师您好,我目前学到更新HTTP服务接口的位置,问题是这样的:
我的更新接口在服务器启动后,第一次是能够更新成功的,但是再次更新后会一直失败,我想因该是第一次更新后我们拿到的*gorm.DB这个句柄出现了异常,因为我们每次操作数据库都要去获得这个东西,第一次出了问题之后,以后再次获取依然会出问题。
然后经过debug,我发现在服务器启动第一次更新数据的时候,会在tx.Commit()的地方出现问题,点进去之后是commit的逻辑:
红色框中的地方应该是对 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连接池再获取时还是那个未关闭的连接。012021-10-07
相似问题
回答 1