DDLによるデッドロック


MariaDB Galera ClusterでDDLをするとデッドロックが発生しますが、このデッドロックは同時発生によるものではありません.Galera Clusterならではの「穴」です.MariaDB Galera ClusterでDDLを行うと、関連テーブルの読み書きトランザクションにデッドロックの異常が報告されます.ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
実験は以下の通りである.
作業の準備をして、テーブルmgcを作成し、いくつかのデータを挿入します.
CREATE TABLE `mgc` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `c1` varchar(32) NOT NULL DEFAULT '',
  `c2` varchar(32) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into mgc(c1,c2) values('a','b'),('a1','b2'),('a3','b3');
-- SQL, 。
insert into mgc(c1,c2)  select c1,c2 from mgc;

1.リード・トランザクションのデッドロック
session1:
begin;
MariaDB [test]> begin;
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> select count(1) from mgc;
+----------+
| count(1) |
+----------+
|  5242880 |
+----------+
1 row in set (1.63 sec)

session 2はDDLを作ります.テーブルのデータ量が大きいので、時間が少し長くなります.
MariaDB [test]> alter table mgc add column c3 varchar(10) not null default ''; 
Query OK, 0 rows affected (18.13 sec)               
Records: 0  Duplicates: 0  Warnings: 0

session 1:session 1がコミットされると、selectにもデッドロックが発生します.MariaDB [test]> commit; ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
2.書き込みトランザクションデッドロックセッション1:
begin; update mgc set c1='xxx' where id=10;

session 2はDDLを作ります.テーブルのデータ量が大きいので、時間が少し長くなります.
MariaDB [test]> alter table mgc add column c4 varchar(10) not null default ''; 
Query OK, 0 rows affected (18.13 sec)               
Records: 0  Duplicates: 0  Warnings: 0

session 1:session 1、コミット、デッドロックも発生します.
MariaDB [test]> commit;
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction