回滚在MySQL中不起作用

回滚在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

我默认使用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 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中,基本上所有更改数据库对象的操作都执行自动提交。主要类别包括:

  • 对象上的任何DDL,如
    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做一些工作。