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を読んだ後、私は上記の例では、基になるクエリは実行中にキャンセルされますが、そうではないようです。 エラーsql: Rows are closed表示されますが、戻るまでに10秒かかります(クエリはMySQLプロセスリストに表示されます)。 これは、ドライバーがサーバーで実行されている基になるクエリを実際にキャンセルできないことを意味しますか?

最も参考になるコメント

その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

マイルストーンのようです。 サービスに回路遮断を追加し、クエリがmysqlで存続することに気付いた他の人にとっては、これらの問題を監視して対応し、メンテナが関心があることを認識できるようにすることができます。

私の仲間のほとんどは、このようなワークフローが機能することが知られているpostgresに精通しており、実装がより簡単で、接続を増やすことなくクエリセッションによってネイティブにサポートされているため、これが機能することを期待していました。

今のところ、私は自分の組織でmysqlがここではあまり友好的ではなく、そのような機能を効果的にサポートすることでmysqlサーバーが接続インターフェースを変更する必要があることを文書化しています。

現在mysqlを使用しているので、回避策があれば便利です。 :-)

このページは役に立ちましたか?
0 / 5 - 0 評価