数据库的mvcc

AUTOCOMMIT
Mysql默认自动提交,可以通过如下命令查看和修改:

mysql> SHOW VARIABLES LIKE ‘AUTOCOMMIT’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| autocommit | ON |
+—————+——-+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT = 1;
MySQL的默认隔离级别REPEATABLE READ(可重复读)解决了脏读,不可重复读问题,但还是无法解决幻读的问题。所谓幻读,指的是A事务读取某个范围内的记录时,另外一个B事务又在该范围内插入了新的记录,A事务再次读取该范围的记录时,会产生幻行。

InnoDB和XtraDB存储引擎通过多版本并发控制(Multiversion Concurrency Control)MVCC解决了幻读的问题。

在Mysql中MVCC是在Innodb存储引擎中得到支持的,Innodb为每行记录都实现了隐藏字段

innoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存行的过期时间。该时间并不是实际的系统时间值,而是系统版本号(system version number)。每开始一个新的事务,系统版本号都会自动递增,这是MySQL服务器的机制。

事务开始时刻的系统版本号会作为该事务的版本号,用来和查询到的每行记录的版本号进行比较。

隐式锁显式锁

InnoDB在开启事务时,获取隐式锁,在事务提交或者回滚时释放锁,InnoDB根据隔离级别自动处理锁。

但InnoDB也支持显式锁:

SELECT … FOR UPDATE

SELECT … LOCK IN SHARE MODE

多版本并发控制(Multiversion Concurrency Controll MVCC)
第一点:

MVCC并不是MySql独有的,Oracle,PostgreSQL等都在使用。

MVCC并没有简单地使用行锁,而是使用“行级别锁”(row-level locking)。MVCC的基本原理是:

在事务中保存数据的快照,这意味着在一个事物里能够看到数据一致的视图,而不用担心这个事务运行多长时间,同时也意味着在同一个时刻不同事务看到的相同表里的数据可能是不同的。

MVCC的基本特征:

每行数据都存在一个版本,每次数据更新时都更新该版本
修改时Copy出当前版本随意修改,个事务之间无干扰
保存时比较版本号,如果成功(commit),则覆盖原记录;失败则放弃copy(rollback)
InnoDB存储引擎MVCC的实现策略:

在每一行数据中额外保存两个隐藏字段:当前行创建时的版本号和删除时的版本号(可能为空)。每个事务又有自己的版本号,这样事务内执行CRUD操作时,就通过版本号的比较来达到数据版本控制的目的。

猜你喜欢

转载自blog.csdn.net/coolwriter/article/details/81171260