MySql MVCC是如何实现的-关于autocommit?

关于autocommit

  • 查看autocommit
show variables like ‘autocommit‘;

mysql> show variables like ‘autocommit‘;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.00 sec)
我们可以看到autocommit的值为ON,说明MySql默认是开启了自动提交事务的。什么意思呢?我们举例说明一下:

  1. 新建表
CREATE TABLE `keyvalue` (
  `key` int(11) NOT NULL AUTO_INCREMENT,
  `value` int(11) DEFAULT NULL,
  PRIMARY KEY (`key`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
  1. 在终端1中插入一条数据
insert into keyvalue(`value`)values(3);

3.在终端2中查询,这时候是可以查询到的

select * from keyvalue where `value`=3;

MySql MVCC是如何实现的-关于autocommit?

4.修改autocommit为OFF

set session autocommit=0;

5.重新执行2-3步骤,这时候的终端2中是查不到终端1中插入的数据的,也就是终端1中插入的数据对终端2不可见。
MySql MVCC是如何实现的-关于autocommit?

6.在终端1中提交事务,再次在终端2中查看,这时候就可以查看到了。
MySql MVCC是如何实现的-关于autocommit?

7.总结:
1.当autocommit为ON状态时,即使没有手动start transaction开启事务,mysql默认也会将用户的操作当做事务即时提交。
2.当autocommit为OFF状态时,mysql仍然会自动开启事务,但是需要用户手动提交,未提交前,A事务对数据库做的修改对B事务是不可见的。

8.思考:当autocommit为ON状态时,用户手动开启事务,mysql会不会自动提交?
答案是:不会

我们测试一下,先将autocommit设置为ON,然后在终端1手动开启一个事务,在终端2中查询,从结果来看,在未手动提交前,终端2中是查看不到的。
MySql MVCC是如何实现的-关于autocommit?

MySql MVCC是如何实现的-关于autocommit?

上一篇:MVC3学习:将excel文件导入到sql server数据库


下一篇:sql注入之查询方式及报错注入