mysql基础之当事务遇到DDL
前言
根据元数据锁,我们知道其它事务的dml会阻塞ddl的执行。如果ddl在事务中执行会怎么样呢?
mysql> select * from users;
+----+----------+------+
| id | name | age |
+----+----------+------+
| 1 | zhangsan | 1 |
| 2 | lisi | 2 |
| 3 | wangwu | 3 |
| 5 | haha | 5 |
| 8 | oo | 8 |
| 9 | wowo | 9 |
+----+----------+------+
分析
1、开启事务,先执行插入操作,再增加字段,最后回滚事务
开启事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
执行插入
mysql> insert into users(id, name, age) values(10, 'hehe', 10);
Query OK, 1 row affected (0.02 sec)
增加字段
mysql> alter table users add column address varchar(255);
Query OK, 0 rows affected (0.12 sec)
Records: 0 Duplicates: 0 Warnings: 0
回滚事务
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
此时查看数据,事务回滚,但是字段和数据都操作成功了
mysql> select * from users;
+----+----------+------+---------+
| id | name | age | address |
+----+----------+------+---------+
| 1 | zhangsan | 1 | NULL |
| 2 | lisi | 2 | NULL |
| 3 | wangwu | 3 | NULL |
| 5 | haha | 5 | NULL |
| 8 | oo | 8 | NULL |
| 9 | wowo | 9 | NULL |
| 10 | hehe | 10 | NULL |
+----+----------+------+---------+
7 rows in set (0.00 sec)
看下binlog,在alter执行前,如果有待提交的事务,则会进行提交。
查看binlog文件命令:show master logs;
查看binlog文件目录:show variables like ‘log_bin%’;
查看binlog命令:mysqlbinlog -v $binlog
2、开启事务,删除字段,再执行插入操作,最后回滚事务
开启事务
删除字段
alter table users drop column address;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
插入数据
insert into users(id, name, age) values(11, 'wuwu', 11);
Query OK, 1 row affected (0.08 sec)
回滚事务
查看数据,字段删除成功,数据插入成功,回滚失效:
mysql> select * from users;
+----+----------+------+
| id | name | age |
+----+----------+------+
| 1 | zhangsan | 1 |
| 2 | lisi | 2 |
| 3 | wangwu | 3 |
| 5 | haha | 5 |
| 8 | oo | 8 |
| 9 | wowo | 9 |
| 10 | hehe | 10 |
| 11 | wuwu | 11 |
+----+----------+------+
8 rows in set (0.01 sec)
查看binlog,alter之前,如果只有begin,则自动失效;后面的插入操作重新自动开启事务并提交:
总结
1、在alter执行前,如果有待提交的事务,则会进行提交;
2、在alter执行之前,如果只有begin,则自动失效;后面的插入操作重新自动开启事务并提交。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 蚂蚁工匠
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果