DDL導致的死鎖

2021-08-20 05:20:30 字數 2301 閱讀 4702

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 對另乙個欄位加了鎖 兩個事務都持有...