为什么在未发出提交时插入记录?

时间:2016-07-16 17:44:22

标签: mysql transactions commit

运行以下语句:

set autocommit = false;
start transaction;
insert into test_table (id,name) values('6','iqbal bano');

虽然我没有发出命令commit,但该条目已插入数据库。这种行为对mysql来说是否自然?如果是的话,为什么会这样呢?令我惊讶的是,如果我运行3个语句:

set autocommit = false;
start transaction;
insert into test_table (id,name) values('7','chitra singh');
insert into test_table (id,name) values('8',nayaara);

第三个语句,返回错误(因为nayaara必须包含在引号内)但是,前一个插入成功,并且在id 7中创建的条目被创建到数据库中。这是什么原因?这是交易进行的方式吗?

注意:Autocommit设置为false,如上面的陈述所示。

1 个答案:

答案 0 :(得分:1)

如果将auto-commit设置为false并且插入经过,则它的部分事务但不会提交到数据库。如果要重新启动数据库,插入将丢失;事务是回滚的,因为你没有说提交。但是,如果您提交然后重新启动,则记录不会丢失。

mysql> set autocommit=false;

    Query OK, 0 rows affected (0.00 sec)

    mysql> insert into test (id) values (5),(6),(7),(8);
    Query OK, 4 rows affected (0.00 sec)
    Records: 4  Duplicates: 0  Warnings: 0

    mysql> select * from test;
    +------+
    | id   |
    +------+
    |    1 |
    |    2 |
    |    3 |
    |    4 |
    |    5 |
    |    6 |
    |    7 |
    |    8 |
    +------+
    8 rows in set (0.00 sec)

    mysql> exit
    Bye
mysql> select * from test;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)

mysql> insert into test (id) values (5),(6),(7),(8);
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from test;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
|    6 |
|    7 |
|    8 |
+------+
8 rows in set (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
|    6 |
|    7 |
|    8 |
+------+
8 rows in set (0.00 sec)