高性能MySql学习笔记——多版本并发控制算法
Mysql默认自动提交,可以通过如下命令查看和修改:
mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;
InnoDB在开启事务时,获取隐式锁,在事务提交或者回滚时释放锁,InnoDB根据隔离级别自动处理锁。
但InnoDB也支持显式锁:
SELECT ... FOR UPDATE
SELECT ... LOCK IN SHARE MODE
第一点:
MVCC并不是MySql独有的,Oracle,PostgreSQL等都在使用。
MVCC并没有简单地使用行锁,而是使用“行级别锁”(row-level locking)。MVCC的基本原理是:
在事务中保存数据的快照,这意味着在一个事物里能够看到数据一致的视图,而不用担心这个事务运行多长时间,同时也意味着在同一个时刻不同事务看到的相同表里的数据可能是不同的。
MVCC的基本特征:
InnoDB存储引擎MVCC的实现策略:
在每一行数据中额外保存两个隐藏字段:当前行创建时的版本号和删除时的版本号(可能为空)。每个事务又有自己的版本号,这样事务内执行CRUD操作时,就通过版本号的比较来达到数据版本控制的目的。具体做法见下面的示意图。
?
但是在网上又看到另外一种说法:
Innodb的实现方式是: