linux centos系统
mysql版本5.1.41use test;
drop table if exists test.a ;
CREATE TABLE `test`.`a` (
  `c2` INT NOT NULL ,
  PRIMARY KEY (`c2`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
insert into test.a select 1;
select * from test.a;
rollback;
select * from test.a;执行结果,为什么rollback;之后,test.a表还有1条记录呢,不是应该回滚后,表里面没有记录吗?

解决方案 »

  1.   

    楼主的第一个贴里我回了,回滚是有条件的,需要在开启事务,并且没有提交的时候才能回滚.就是说你看看你自己的session 线程里面的 autocommit 是什么值;你的autocommit 是多少? 1 还是0 
      

  2.   


    是1啊,如果一个mysql库里面既有myisam表,又有innodb表的话,这个autocommit应该设置成多少呢?
      

  3.   

    myisam 不支持事务,都是自动提交的;
    1:自动提交,你insert 的进去的时候,mysql马上就提交了,还没等你rollback.
    所以楼主想要rollback的话 需要 手动开启事务且不提交,方法:
    start transaction/begin/set autocommit=0
    设置成0之后,楼主就可以自己insert 之后,手动的提交或则回滚;(commit\rollback)
    楼主做下实验就知道了;
      

  4.   

    select @@autocommit;
    select @autocommit;贴出来以供分析。
      

  5.   

    mysql> set autocommit=1;
    Query OK, 0 rows affected (0.01 sec)mysql> insert into test values(3, 4);
    Query OK, 1 row affected (0.05 sec)mysql> rollback;
    Query OK, 0 rows affected (0.00 sec)mysql> select * from test;
    +------+------+
    | id   | col2 |
    +------+------+
    |    1 |    2 |
    |    2 |    1 |
    |    1 |    3 |
    |    3 |    4 |
    +------+------+
    4 rows in set (0.00 sec)mysql> set autocommit=0;
    Query OK, 0 rows affected (0.00 sec)mysql> insert into test values(4, 4);
    Query OK, 1 row affected (0.00 sec)mysql> rollback;
    Query OK, 0 rows affected (0.03 sec)mysql> select * from test;
    +------+------+
    | id   | col2 |
    +------+------+
    |    1 |    2 |
    |    2 |    1 |
    |    1 |    3 |
    |    3 |    4 |
    +------+------+
    4 rows in set (0.00 sec)mysql>当autocommit=0时,需要显式的commit来提交事务。
      

  6.   

    我就举个回滚的吧:
    mysql> create table auto(id int);
    Query OK, 0 rows affected (0.39 sec)mysql> select @@autocommit;
    +--------------+
    | @@autocommit |
    +--------------+
    |            1 |
    +--------------+
    1 row in set (0.00 sec)mysql> set autocommit =0;
    Query OK, 0 rows affected (0.00 sec)mysql> insert into auto values(1),(2);
    Query OK, 2 rows affected (0.00 sec)
    Records: 2  Duplicates: 0  Warnings: 0mysql> select * from auto;
    +------+
    | id   |
    +------+
    |    1 |
    |    2 |
    +------+
    2 rows in set (0.00 sec)mysql> rollback;
    Query OK, 0 rows affected (0.05 sec)mysql> select * from auto;
    Empty set (0.00 sec)要是rollback 改成commit 提交事务的话,则会写到表里面去了;--------
    要是set autocommit =0 不执行的话,则rollback无效;楼主可以自己测试;
      

  7.   


    那为什么,我没有commit,也没有rollback,我只有commit,过一会后,也能select 出来呢?