TL;DR
- ちょっと試してみただけなのでフツーに使うことはまずない。自分ですら使おうと思っていない。
パッチはこれだけ。
$ diff ./sql/sys_vars.cc.orig ./sql/sys_vars.cc
5196a5197,5204
> // NO_CMD_LINE - different name of the option
> static Sys_var_transaction_isolation Sys_tx_isolation(
> "tx_isolation", "Default transaction isolation level."
> "This variable is deprecated and will be removed in a future release.",
> UNTRACKED_DEFAULT SESSION_VAR(transaction_isolation), NO_CMD_LINE,
> tx_isolation_names, DEFAULT(ISO_REPEATABLE_READ), NO_MUTEX_GUARD,
> NOT_IN_BINLOG, ON_CHECK(check_transaction_isolation));
>
両方使える ( tx_isolation
がdeprecatedで transaction_isolation
が推奨 ) MySQL 5.7.42の記述はこんな感じ。
https://github.com/mysql/mysql-server/blob/mysql-5.7.42/sql/sys_vars.cc#L4221-L4238
型としては Sys_var_tx_isolation
で受けて、他のコードでトランザクション分離レベルを参照する時も thd->tx_isolation
とか thd->variables.tx_isolation
で参照している。
MySQL 8.0ではこれを逆に tx_isolation
を Sys_var_transaction_isolation
型に受けるようにすれば良さそうな気がした。
https://github.com/mysql/mysql-server/blob/mysql-8.0.33/sql/sys_vars.cc#L5197-L5202
言うても thd->tx_isolation
は tx_isolation
のままっぽい。
https://github.com/mysql/mysql-server/blob/mysql-8.0.33/sql/sql_class.cc#L1087
一方で、 substitute
の属性はなくなっているのでdeprecated warningとかを出すのはそのままでは無理な気がするけど試してないし気にしていない。
https://github.com/mysql/mysql-server/blob/mysql-5.7.42/sql/sys_vars.h#L2100-L2116
https://github.com/mysql/mysql-server/blob/mysql-8.0.33/sql/sys_vars.h#L2343-L2354
というわけで
mysql80 9> SELECT @@version, @@tx_isolation;
+--------------+-----------------+
| @@version | @@tx_isolation |
+--------------+-----------------+
| 8.0.33-debug | REPEATABLE-READ |
+--------------+-----------------+
1 row in set (0.00 sec)
出来上がりはしたけど、使わずに済むことを祈る。