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)

session2
做一個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

session1:
session1 提交,select 居然也會出現死鎖。
MariaDB [test]> commit;
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction


2.寫事務死鎖
session1:

begin; update mgc set c1='xxx' where id=10;

session2
做一個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

session1:
session1,提交,也會出現死鎖。

MariaDB [test]> commit;
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章