MVCC(Multi-Version Concurrency Control)多版本并发控制,在数据库管理系统中,实现对数据库的并发访问。可以做到读写不阻塞,且避免了类似脏读这样的问题,主要通过undo日志链来实现。
MVCC会保存某个时间节点上的数据快照,这意味着事务可以看到一个一致的数据视图,不管他们需要跑多久。这同时意味着不同的事务在同一个时间点看到的同一个表的数据可能是不同的。
数据库有哪些并发情况:
再了解两个基本概念:
当前读,和快照读,
select lock in share mode;加读锁(共享锁 S锁)
如:select * from books where book_id = 7 lock in share mode;
select for update;加读锁(排它锁 X 锁))
如:select * from books where book_id = 7 for update;
隔离级别:
read commit(读已提交),语句级快照
repeatable read(可重复读),事务级快照
这两种事务的底层实现原理都是MVCC。
在数据库中创建一张数据库表时,数据库在后台会给表加上三个隐藏字段,DB_TRX_ID,DB_ROLL_PTR,DB_ROW_ID。DB_TRX_ID是记录创建这条记录或者最后一次修改该记录的事务id,DB_ROLL_PTR(回滚指针)指向上一条记录数。当需要回滚操作时根据这个指针找到上一条记录数进行数据的回滚操作。DB_ROW_ID隐藏主键,如果没有显示主键的话就会多一个隐藏主键。
数据被操作一次就会有一次记录,在undo日志中会记录数据的不同版本,这是版本记录链,
undolog是回滚日志,记录的是数据的历史版本。
undolog中形成的链表,链首是最新的旧数据,链尾是最久的旧数据
read commit(读已提交),语句级快照
隔离级别read commit(读已提交),每次读取的时候,读的都是这个undo日志版本链中已提交最新的数据。
repeatable read(可重复读),事务级快照
隔离级别 repeatable read(可重复读),事务首次查询的时候,查询出来的数据的当时的版本会与当前事务有一个绑定的关系,当事务再查询的时候,查询的还是之前与之绑定的版本数据