mysql函数commit,Mysql中autocommit参数详解

运行环境:

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语句没有影响。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值