回滚在MySQL中不起作用
我默认使用InnoDb引擎。这看起来很奇怪:回滚在MySQL中不起作用,mysql,sql,Mysql,Sql,我默认使用InnoDb引擎。这看起来很奇怪: mysql> start transaction; Query OK, 0 rows affected (0.00 sec) mysql> set session transaction isolation level serializable; Query OK, 0 rows affected (0.00 sec) mysql> create table test_1(id int); Query OK, 0 rows af
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> set session transaction isolation level serializable;
Query OK, 0 rows affected (0.00 sec)
mysql> create table test_1(id int);
Query OK, 0 rows affected (0.07 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> show tables;
+------------------+
| Tables_in_reestr |
+------------------+
| test_1 |
+------------------+
1 rows in set (0.00 sec)
这看起来很奇怪,因为我启动了事务并回滚,但没有用。那么,我做错了什么呢?展开上面的评论:在MySQL中,基本上所有更改数据库对象的操作都执行自动提交。主要类别包括:
CREATE/ALTER/DROP TABLE/VIEW/INDEX
mysql
,如ALTER/CREATE USER
ANALYZE
INSERT
、UPDATE
和DELETE
是安全的,而其他任何东西都不是
来源:检查:。天哪,什么?!这么长的声明清单。这真是难以置信。我刚刚测试过,如果我在
CREATE
之后立即将INSERT
添加到表中,那么在回滚之后,我仍然可以看到数据被添加到表中,这与我想要实现的相反。这是否意味着MySQL如此违反直觉,实际上是垃圾??您必须在创建
之后和插入
之前启动一个新事务,因为上一个事务已提交,因此结束了。谢谢!这是绝对正确的。我刚刚检查过它,它的工作原理和你说的一样。顺便说一句,在许多其他流行的数据库中,事务的行为更直观。嗯,这要看情况而定。SQL Server,是的,但Oracle在这种情况下的行为与MySQL非常相似。至于Oracle,如果我从这里理解正确的话,那么它的行为方式与MySQL不同。至少是Oracle的现代版本。是和否。默认情况下,Oracle的现代版本(包括11.2和12.1)在所有DDL操作之前执行隐式提交,请参阅。“基于版本的重新定义”有点不同,需要DBA做一些工作。