go-sql-driver context cancel tidb不生效

各位大佬好~
tidb版本:v5.x
问题描述:
当我使用go-sql-driver访问tidb时,会发生ctx结束后,tidb对应的会话无法取消的情况,但是MySQL没有此问题。
代码如下:

# 10s超时
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()

# 执行查询
rows, err := db.QueryContext(ctx,"select sleep(600)")

10s 后触发超时,代码返回符合预期,如下:

context deadline exceeded

但是此时登录tidb发现该查询,tidb未结束掉
image

辛苦各位帮忙看看,如何解决?不希望每次去kill。或者哪里可以传递参数?

您面临的问题似乎与go-sql-driver/mysql的实现有关。根据文档,当使用go-sql-driver/mysql时,您需要编写错误处理逻辑,手动关闭*sql.Rows,并且不能轻松地重用代码,这使得您的代码稍微冗余。

然而,文档没有提到您在TiDB中使用上下文取消不起作用的问题。当使用TiDB时,go-sql-driver/mysql的实现可能存在错误或限制,导致上下文取消不起作用。
尝试使用Golang的推荐ORM库GORM,而不是go-sql-driver/mysql。文档提供了如何在TiDB事务中使用GORM的说明。

1 个赞

打卡打卡