1、mysql事务特性
原子性、一致性、持久性、隔离性
2、事务隔离的级别
因为事务隔离会出现脏读、不可重复读、换读的问题,为了解决这些问题,事务的隔离有四个级别:读未提交、读提交、可重复读、串行化。其中的读提交和可重复读级别背后的实现用到的就是mvcc。
3、mvcc
mvcc(Mutil-Version Concurrency Control),多版本并发控制指的是 “维持一个数据的多个版本,使得读写操作没有冲突” 。
4、mvcc实现原理
mvcc的实现主要有三部分构成:记录的隐式字段、undolog、视图。
a、记录的隐式字段
DB_TRX_ID:记录创建这条记录/最后一次修改该记录的事务ID
DB_ROLL_PTR:回滚指针,指向这条记录的上一个版本
DB_ROW_ID:隐含的自增ID(隐藏主键),如果数据表没有主键,InnoDB会自动以DB_ROW_ID产生一个聚簇索引
实际还有一个删除flag隐藏字段, 既记录被更新或删除并不代表真的删除,而是删除flag变了
b、undolog
c 、视图
事务在进行快照读的时候产生的快照图,即视图。在该事务执行的快照读的那一刻,会生成数据库系统当前的一个快照,记录并维护系统当前活跃事务的ID。我们可以把Read View简单的理解成有三个全局属性:
trx_list:一个数值列表,用来维护Read View生成时刻系统正活跃的事务ID
up_limit_id:记录trx_list列表中事务ID最小的ID
low_limit_id:ReadView生成时刻系统尚未分配的下一个事务ID,也就是目前已出现过的事务ID的最大值+1
Read View遵循的可见性算法
比如事务1生成视图,取到视图中的DB_TRX_ID,如果DB_TRX_ID小于up_limit_id,则该视图对于事务1可见(注:事务1处于trx_list中)。如果大于low_limit_id,则该视图对于事务1不可见。如果在trx_list区间,但是在trx_list找得到,则说明事务DB_TRX_ID还没有提交,该视图对于事务1不可见。如果在trx_list区间,但是在trx_list找不到,则该视图对于事务1可见。
d、当前读、快照读的定义
当前读:就是它读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁
快照读:不加锁的非阻塞读
e、RR是如何在RC级的基础上解决不可重复读的?
在RC隔离级别下,是每个快照读都会生成并获取最新的Read View;而在RR隔离级别下,则是同一个事务中的第一个快照读才会创建Read View, 之后的快照读获取的都是同一个Read View。
网友评论