RailsアプリケーションでMySQLのMAX_EXECUTION_TIMEを適用する

MAX_EXECUTION_TIMEを設定できるレイヤーは、 「DBのシステム変数」 「モデルごとに適用する( https://github.com/rails/rails/pull/35615 )」「プロセスごとに適用する」がある。
「DBのシステム変数」 に関しては、システム共通の値となるため使いにくい。「モデルごとに適用する」に関しては、使われ方によっては有用だけど、どのアプリでも使えるわけではないと思う。本テキストでは、最後の 「プロセスごとに適用する」について説明する。

Railsアプリにおいては、「非同期ジョブプロセス」と「WEBプロセス」で、MAX_EXECUTION_TIMEを分けたいはず。例えば、バッチ処理はオンライン処理と比べて、MAX_EXECUTION_TIMEは長くなるだろう。
そういう時は config/database.yml を次のように記述し、環境変数 MYSQL_MAX_EXECUTION_TIME を設定してプロセスを起動すればいい。

production: 
  adapter: mysql2
[...]
  variables:
    max_execution_time: <%= ENV.fetch('MYSQL_MAX_EXECUTION_TIME', 100_000) %> # ms
$ MYSQL_MAX_EXECUTION_TIME=30000 bin/rails s
$ MYSQL_MAX_EXECUTION_TIME=90000 bin/sidekiq

テストコードは次のようなものを書けばよさそう。

expect(ActiveRecord::Base.connection.execute("SHOW VARIABLES LIKE 'max_execution_time'").to_a).to eq([["max_execution_time", "100000"]])

以上。