登录
首页 >  Golang >  Go教程

Go SQL 查询取消:让慢查询跟着请求一起停

来源:Golang学习网专题原创

时间:2026-06-09 02:06:00 133浏览 收藏

所属专题:Go 并发治理实战

入口请求已经超时,但 SQL 仍在数据库里跑,这种情况会继续占用连接池和数据库资源。database/sql 提供的 Context API 可以把取消信号传到查询层。

QueryContext 的意义

QueryContext 接收 context,当 deadline 到达或请求取消时,驱动有机会取消查询并释放连接。具体行为取决于驱动,但使用 Context API 是必要前提。

事务也要有 context

BeginTx 可以传入 context。长事务如果不受控,会持有锁和连接,放大并发问题。事务内部的每条查询也应该使用同一个 ctx。

取消后要正确收尾

Rows 必须关闭,事务失败要 rollback。不要因为 context 超时就跳过清理逻辑。

代码示例

tx, err := db.BeginTx(ctx, nil)
if err != nil { return err }
defer tx.Rollback()

if _, err := tx.ExecContext(ctx, updateSQL, args...); err != nil {
    return err
}
return tx.Commit()

上线检查

  • 禁止在请求链路中使用 Query/Exec 替代 Context 版本。
  • Rows 和 Tx 都有清理逻辑。
  • 慢查询日志能关联 trace/request id。
声明:本文转载于:Golang学习网专题原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>