MariaDB 12系の初LTSである、12.3がリリースされました。

https://mariadb.com/docs/release-notes/community-server/12.3/mariadb-12.3-changes-and-improvements

12系を見て、ちょっときになった点を挙げておきます。

これまではINSERTだけだったので、ちょっとうれしい。

INSERTと違って、UPDATE/DELETEは最後に書くみたいです。

これも嬉しいですね。これまでも通っていたのですが、完全な互換ではなかったようです。

あんまり使うことはないのですが、集計クエリーでちょっとオプティマイザを変えたいなと思うときは便利です。

外部キーのConstraintNameは、データベース内で一意である必要があったのですが、

今後はテーブル内一意でよいそうです。

データベース一意だと、REPLACEとかで邪魔になるからだそうです。

これはすごいですね。内部XAトランザクションが省略されるので、かなりパフォーマンスアップになると思います。

色々制約はあるようですが、以下が詳しく解説してくれています。

https://blog.s-style.co.jp/2026/04/15832

私は、普段は「READ-COMMITTED」で、「for update」などのロックを使ってしまうので、

あんまり関係ないですが、「REPEATABLE-READ」を使っている人は要注意です。

というわけで、ちょっと検証してみました。


1.transaction_isolationが「REPEATABLE-READ」で、innodb_snapshot_isolationが「0」

従来の「REPEATABLE-READ」の挙動です。

(SESSION A)(SESSION B)
> begin;
> begin;
> select * from t1 where id = 1;
+—-+——+
| id | name |
+—-+——+
| 1 | taro |
+—-+——+
> select * from t1 where id = 1;
+—-+——+
| id | name |
+—-+——+
| 1 | taro |
+—-+——+
> update t1 set name = ‘jiro’ where id = 1;
Query OK, 1 row affected (0.001 sec)
> update t1 set name = ‘saburo’ where id = 1;
Query OK, 1 row affected (4.352 sec)
> commit;
> commit;
> select * from t1 where id = 1;
+—-+——–+
| id | name |
+—-+——–+
| 1 | saburo |
+—-+——–+
★「jiro」でUPDATEしたはずなのに、消えた!

2.transaction_isolationが「REPEATABLE-READ」で、innodb_snapshot_isolationが「1」

12.3のデフォルトの挙動です。

(SESSION A)(SESSION B)
> begin;
> begin;
> select * from t1 where id = 1;
+—-+——+
| id | name |
+—-+——+
| 1 | taro |
+—-+——+
> select * from t1 where id = 1;
+—-+——+
| id | name |
+—-+——+
| 1 | taro |
+—-+——+
> update t1 set name = ‘jiro’ where id = 1;
Query OK, 1 row affected (0.001 sec)
> update t1 set name = ‘saburo’ where id = 1;
★SESSION AのCOMMITまで待ちになる
> commit;
ERROR 1020 (HY000): Record has changed since last read in table ‘t1’; try restarting transaction

★SESSION AのCOMMIT後、上記エラーとなる

というように、挙動が変わります。

これは個人的には正しい挙動かと思います。

とはいえ、これを理解して、ロックを回避するというのを開発側に伝えるのもちょっと難しい気もします。

ロックがない分散DBなんかも、こんな形でエラーを起こすことはあると思うので、どっかで役に立つかもしれません。


ちなみに、私の作っているmagntadeskでは、0.9.3で、MariaDB12.3に対応しています。

https://github.com/shigenobu/magentadesk/releases

以上

コメントがあればどうぞ


CAPTCHA Image
Reload Image