MariaDB Galera ClusterでGET_LOCKを使ったらクラッシュした

GMOアドマーケティングのT.Kです。アプリケーションの同時実行を制御するためにGET_LOCKを使ったら、DBがクラッシュした事例に遭遇したので紹介します。

対象バージョン

MariaDB 10.3.36

事前準備

再現手順

  • ノードA
    GET_LOCKでロックを取得してからトランザクションを開始します。
  • ノードB
    別のノードから同じレコードを更新してノードAの処理を失敗させます。
  • ノードA
    Deadlockが発生したのでcommitは失敗になります。RELEASE_LOCKを実行するとクラッシュします。
    RELEASE_LOCKを明示的に実行しなくても、接続が切れる時に暗黙で実行されてクラッシュします。

まとめ

MariaDB Galera Clusterの制限事項ではGET_LOCKを含めいくつかの明示的なロックをサポートしていません。 MariaDB 10.4.26や10.6.10は同じ手順でも問題はなかったが、トランザクション機能のみで実装した方が良さそうです。