Mysql: 上下文取消会取消底层查询吗?

创建于 2018-01-05  ·  6评论  ·  资料来源: go-sql-driver/mysql

ctx, cancel := context.WithCancel(context.Background())

// Cancel 5 seconds in.
go func() {
    time.Sleep(time.Second * 5)
    cancel()
}()

// This query should take 10 seconds to return.
rows, err := dbt.db.QueryContext(ctx, "SELECT v, SLEEP(10) FROM test LIMIT 1")
fmt.Println(rows, err)

阅读https://github.com/go-sql-driver/mysql/issues/496https://github.com/go-sql-driver/mysql/pull/608 后,我的印象是在上面的例子中,底层查询会在执行过程中被取消,但情况似乎并非如此。 返回仍然需要 10 秒(并且查询显示在 MySQL 进程列表中),尽管出现错误sql: Rows are closed 。 这是否意味着驱动程序实际上无法取消在服务器上运行的底层查询?

最有用的评论

有没有计划修复那个 TODO?

所有6条评论

你好,我是#608 的作者。

这是否意味着驱动程序实际上无法取消在服务器上运行的底层查询?

是的,我的工具不会终止在服务器上运行的查询。
它仍然处于 TODO 状态。

https://github.com/go-sql-driver/mysql/blob/9181e3a86a19bacd63e68d43ae8b7b36320d8092/driver_go18_test.go#L270

仅供参考,您可以通过提示限制查询执行时间。
https://dev.mysql.com/doc/refman/5.7/en/optimizer-hints.html#optimizer -hints-execution-time

@shogo82148 @methane谢谢。

有没有计划修复那个 TODO?

有没有计划修复那个 TODO?

https://github.com/go-sql-driver/mysql/pull/791

看起来它处于里程碑 btw。 对于其他向服务添加熔断机制并发现查询在 mysql 中持续存在的人,您可能希望观察这些问题并对这些问题做出反应,以便维护人员知道有兴趣。

我的大多数同行都希望这能奏效,因为他们更熟悉 postgres,其中已知此类工作流可以工作,更容易实现/由查询会话本机支持,而无需建立更多连接。

现在,我在我的组织中记录了 mysql 在这里不太友好,对此类功能的有效支持将保证 mysql 服务器更改其连接接口。

解决方法会很好,因为我们目前使用 mysql 太多了。 :-)

此页面是否有帮助?
0 / 5 - 0 等级