Mysql中autocommit参数详解
2021-03-04 本文已影响0人
牧码人zhouz
运行环境:
Mysql: 5.7.31
背景知识:
- Mysql默认引擎是InnoDB,InnoDB引擎是支持事务的
- autocommit参数默认是开启的
1. 准备工作,在客户端A进行如下操作:
- 查看Mysql版本和
autocommit
参数:
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进行如下操作:
- 修改
autocommit
参数为off
:
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
(事务自动提交)默认是开启的。此时,当我们执行一条语句之前,默认会开启事务,语句执行完后,系统会自动帮我们提交事务;
- 当我们关闭自动提交后,当前客户端执行的语句,必需手动
commit
之后,其它的客户端才能查询到; -
autocommit
参数对DDL语句没有影响。