GA

2023/05/08

MySQL 8.0でtx_isolationを使わせるようにするパッチ

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_isolationSys_var_transaction_isolation 型に受けるようにすれば良さそうな気がした。

https://github.com/mysql/mysql-server/blob/mysql-8.0.33/sql/sys_vars.cc#L5197-L5202

言うても thd->tx_isolationtx_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)


出来上がりはしたけど、使わずに済むことを祈る。

0 件のコメント :

コメントを投稿