DDL导致的死锁

本文探讨了MariaDB Galera Cluster环境中执行DDL操作时遇到的死锁问题,尤其是在读写事务中。通过具体实验展示了DDL操作如何影响正在进行的读写事务,导致异常错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值