什么直播可以做游戏视频网站,大型外贸网站策划,大网站服务器维护费用,网站怎么赚钱的MySQL-MVCC#xff08;Multi-Version Concurrency Control#xff09;
MVCC#xff08;多版本并发控制#xff09;#xff1a;为了解决数据库并发读写和数据一致性的问题#xff0c;是一种思想#xff0c;可以有多种实现方式。
核心思想#xff1a;写入时创建行的新版…MySQL-MVCCMulti-Version Concurrency Control
MVCC多版本并发控制为了解决数据库并发读写和数据一致性的问题是一种思想可以有多种实现方式。
核心思想写入时创建行的新版本读取时查看当前行版本。
InnoDB解决方法思路undo logread view
1.undo log trx_id表示最近修改该行的事务id。
roll_pointer指向的是上一个版本数据地址。
trx_id每次开启一个事务时事务都有一个id如果事务对行进行了修改同时修改行的trx_id为当前事务的id。
roll_pointer事务对行进行了修改同时将历史版本数据写入undo log并修改roll_pointer指针指向修改前的版本。
举例使用更新语句更新表中内容。
update users set age 30 where id 1;
update users set age 40 where id 1;undo是一种逻辑日志主要在事务的执行过程中记录数据修改的历史版本在必要的时候恢复到历史的状态。这些连接的版本数据称为版本链。
undo的回滚方式如果要将数据回归为历史的版本InnoDB做的是与之前相反的工作对于insertInnoDB会执行一个delete。对于deleteInnoDB会执行一个insert。对于update会执行一个相反的update。
2.Read View
随着版本链的增长事务读取的时候可以读取哪一个版本呢这将是我们接下来要解决的问题。
什么时候生成Read View在READ COMMITTED隔离级别下每次读取数据时都会生成一个新的Read View。而在REPEATABLE READ隔离级别下只有在事务中的第一个SELECT操作快照读时才会创建Read View之后的SELECT操作不会再创建新的Read View。
Read View的几个属性
trx_ids表示的是在Read View生成时刻系统里活跃的事务ID列表。up_limit_id记录trx_list列表中事务ID最小的ID。low_limit_idRead View生成时刻系统尚未分配的下一个事务ID也就是目前已出现过的事务ID的最大值1。
读取数据过程
如果读取的行的事务id是创建Read View事务id说明该事务修改了返回的是当前事务修改后的数据。如果读取行的事务id是trx_ids列表中的说明是对自己不可见的数据需要从版本链中查找。如果读取的行的事务id不是trx_ids列表中的且行事务id小于当前事务id说明是已经提交了的事务对自己可见。
快照读和当前读
快照读实现是基于Read View。 当前读始终读取的是最新的数据。
MVCC是否有解决幻读问题
对于部分场景解决了幻读问题部分场景没有解决。如果仅仅是查询操作的话可以解决幻读快照读如果是对新插入的数据进行更新当前读就会发生幻读。
3.总结
MVCC只在RCREAD COMMITED和RRREAD REPEATABLE )中生效因为READ UNCOMMITED读取的永远都是最新数据SERIALIZABLE会对读取的行加锁不需要解决并发和数据一致性问题。
参考书籍
[1]High Performance MySQL[M].,:792.
[2]MySQL技术内幕[M].,:391.