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='***'
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
Oracle PL SQL之DDL導致的隱式提交
1.如果ddl語法正確,即使執行失敗,也會導致隱式提交 建立表dept1,雖然表dept1已經存在,並提示名稱已有現有物件使用,仍然隱式提交insert into記錄 1 單個sql 2 儲存過程 create or replace procedure p insert dept asbegin i...
事物導致的死鎖問題分析
先看異常日誌 在乙個事物中既有update,又有select for update 意向排它鎖 資料庫中,有user id的索引和user id與auth type的聯合索引 session 1 session 2 begin begin update cre auth status set use...
index merge導致MySql死鎖問題
index merge 導致線上死鎖問題 問題造成條件 兩個事務分別執行兩次update操作 每個用到了兩個及以上索引 由於兩邊索引順序不一致導致 造成原因 innodb使用索引來實現行級別的鎖,事務a 通過index1 對某個欄位加了鎖 事務b 通過index2 對另乙個欄位加了鎖 兩個事務都持有...