MVCC机制

多版本并发控制(MVCC,Multiversion Currency Control)。一般情况下,事务性储存引擎不是只使用表锁,行加锁的处理数据,而是结合了MVCC机制,以处理更多的并发问题。Mvcc处理高并发能力最强,但系统开销比最大(较表锁、行级锁),这是最求高并发付出的代价。

快照读

select ...
select * from table ...;

当前读

特殊的读操作,插入/更新/删除操作,属于当前读,处理的都是当前的数据,需要加锁。事务的隔离级别实际上都是定义了当前读的级别,MySQL为了减少锁处理(包括等待其它锁)的时间,提升并发能力,引入了快照读的概念,使得select不用加锁。而update、insert这些“当前读”,就需要另外的模块来解决了。

select * from table where ? lock in share mode;
select * from table where ? for update;
insert;
update ;
delete;

隐藏列

DB_TRI_ID:插入或者更新行的最后一个事务的事务标识符,删除视为更新,将其标记为已删除
DB_ROLL_PTR:写入rollback段撤销日志记录,若行已更新,则撤销日志记录包含在更新行之前重建内容行所需的内容
DB_ROW_ID:行标识(隐藏单调自增ID)

增删查改操作

MVCC只在READ COMMITED 和 REPEATABLE READ 两个隔离级别下工作。READ UNCOMMITTED总是读取最新的数据行,而不是符合当前事务版本的数据行。而SERIALIZABLE 则会对所有读取的行都加锁
  • SELECT:InnoDB查找版本(DB_TRX_ID)早于当前事务版本的数据行(行的系统版本号<=事务的系统版本号,这样可以确保数据行要么是在开始之前已经存在了,要么是事务自身插入或修改过的)行的删除版本号(DB_ROLL_PTR)要么未定义(未更新过),要么大于当前事务版本号(在当前事务开始之后更新的)。这样可以确保事务读取到的行,在事务开始之前未被删除。
  • INSERT:InnoDB为新插入的每一行保存当前系统版本号作为版本号
  • DELETE:InnoDB为删除的每一行保存当前的系统版本号作为行删除标识
  • UPDATE:InnoDB为插入一行新记录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标识

粥于于
9 声望1 粉丝

代码搬运工


引用和评论

0 条评论