Mysql中autocommit参数详解

2021-03-04  本文已影响0人  牧码人zhouz

运行环境:

Mysql: 5.7.31

背景知识:

  • Mysql默认引擎是InnoDB,InnoDB引擎是支持事务的
  • autocommit参数默认是开启的
1. 准备工作,在客户端A进行如下操作:
mysql> select @@version;
+-----------+
| @@version |
+-----------+
| 5.7.31    |
+-----------+
1 row in set (0.00 sec)

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
1 row in set (0.00 sec)
mysql> create table `user`(
    -> id int(11) NOT NULL AUTO_INCREMENT,
    -> name varchar(64),
    -> age int(11),
    -> PRIMARY KEY(id)
    -> )engine=Innodb default charset=utf8mb4 collate=utf8mb4_unicode_ci;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into user(id, name, age) values(1, 'zhangsan', 21);
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+----+----------+------+
| id | name     | age  |
+----+----------+------+
|  1 | zhangsan |   21 |
+----+----------+------+
1 row in set (0.00 sec)
2. 打开客户端B,并查询:
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
1 row in set (0.00 sec)

mysql> select * from user;
+----+----------+------+
| id | name     | age  |
+----+----------+------+
|  1 | zhangsan |   21 |
+----+----------+------+
1 row in set (0.00 sec)

可以看到 客户端A 的插入操作已经自动提交了,在 客户端B 是可见的。

3. 回到客户端A进行如下操作:
mysql> set @@autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            0 |
+--------------+
1 row in set (0.00 sec)
mysql> insert into user(id, name, age) values(2, 'lisi', 22);
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+----+----------+------+
| id | name     | age  |
+----+----------+------+
|  1 | zhangsan |   21 |
|  2 | lisi     |   22 |
+----+----------+------+
2 rows in set (0.00 sec)
4. 在客户端B,执行如下操作:
mysql> select * from user;
+----+----------+------+
| id | name     | age  |
+----+----------+------+
|  1 | zhangsan |   21 |
+----+----------+------+
1 row in set (0.00 sec)

mysql> select * from information_schema.INNODB_TRX\G;
*************************** 1. row ***************************
                    trx_id: 1831
                 trx_state: RUNNING
               trx_started: 2021-03-04 11:54:53
     trx_requested_lock_id: NULL
          trx_wait_started: NULL
                trx_weight: 2
       trx_mysql_thread_id: 3
                 trx_query: NULL
       trx_operation_state: NULL
         trx_tables_in_use: 0
         trx_tables_locked: 1
          trx_lock_structs: 1
     trx_lock_memory_bytes: 1136
           trx_rows_locked: 0
         trx_rows_modified: 1
   trx_concurrency_tickets: 0
       trx_isolation_level: REPEATABLE READ
         trx_unique_checks: 1
    trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
 trx_adaptive_hash_latched: 0
 trx_adaptive_hash_timeout: 0
          trx_is_read_only: 0
trx_autocommit_non_locking: 0
1 row in set (0.00 sec)

ERROR:
No query specified

此时客户端B是看不到客户端A新插入的数据的;同时可以看到,有一个事务正处于运行状态,没有完成。

5. 在客户端A,提交事务:
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
6. 回到客户端B,进行查询:
mysql> select * from user;
+----+----------+------+
| id | name     | age  |
+----+----------+------+
|  1 | zhangsan |   21 |
|  2 | lisi     |   22 |
+----+----------+------+
2 rows in set (0.00 sec)

mysql> select * from information_schema.INNODB_TRX\G;
Empty set (0.01 sec)

ERROR:
No query specified

可以看到,客户端A插入的第二条记录已经可以看到了,也没有运行中的的事务了。

7. 在客户端A,执行如下操作:
mysql> alter table user drop column age;
Query OK, 0 rows affected (0.11 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select * from user;
+----+----------+
| id | name     |
+----+----------+
|  1 | zhangsan |
|  2 | lisi     |
+----+----------+
2 rows in set (0.00 sec)
8. 在客户端B上查看:
mysql> select * from user;
+----+----------+
| id | name     |
+----+----------+
|  1 | zhangsan |
|  2 | lisi     |
+----+----------+
2 rows in set (0.00 sec)

能够看到,在客户端A修改表结构之后,不需要手动提交,客户端B立刻就能看到,可见autocommit参数对DDL语句没有影响。

总结一下:

  • Mysql中默认引擎为Innodb,Innodb的autocommit(事务自动提交)默认是开启的。此时,当我们执行一条语句之前,默认会开启事务,语句执行完后,系统会自动帮我们提交事务;
上一篇 下一篇

猜你喜欢

热点阅读