基本概念
MVCC是一种并发控制机制,用于多个并发事务同时读写数据库时保持数据的一致性和隔离性,MVCC 通过创建数据的多个版本和使用快照读取来实现并发控制(通过在每个数据行上维护多个版本的数据来实现的。当一个事务对数据库进行修改时会创建一个快照),读操作使用旧版本数据的快照,写操作创建新版本。
事务操作
当一个事务进行读操作时,它会使用快照读,写操作时,会生成一个新的数据脚本,并将修改后的数据写入数据库。事务提交时所做的修改将成为数据库的最新版本,对其他的事务可见。回滚时,所做的修改将被撤销,对其他事务不可见。为了防止数据库中的版本无限增长,MVCC 会定期进行版本的回收(删除不要的数据)。
InnoDB 对 MVCC 的实现
MVCC
的实现依赖于:隐藏字段、Read View、undo log,在内部实现中,InnoDB
通过数据行的 DB_TRX_ID
和 Read View
来判断数据的可见性,如不可见,则通过数据行的 DB_ROLL_PTR
找到 undo log
中的历史版本。每个事务读到的数据版本可能是不一样的,在同一个事务中,用户只能看到该事务创建 Read View
之前已经提交的修改和该事务本身做的修改。
MVCC+Next-key-Lock 防止幻读
InnoDB
存储引擎在 RR 级别下通过 MVCC
和 Next-key Lock
来解决幻读问题。