0
点赞
收藏
分享

微信扫一扫

MySQL基础知识事务及MVCC

事务

事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

 

特性

原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败;处理全部或全部事务的事务。这确保处理多个事务时,所有事务都已执行,或者没有成功的事务

一致性(Consistency):事务完成时,必须使所有的数据都保持一致性;确保在会话期间必须完全执行才能记录到数据库,如果在运行过程中出现问题,则事务将回滚回其原始状态

隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行;这确保事务被隔离,而不是共享内存访问

持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的;确保无法打开或使用新的损坏数据库将在损坏之前重新启动现有数据

 

 

原子性,一致性,持久性:由redo log 和 undo log 保证实现

 

隔离性:锁和MVCC 保证实现

MySQL基础知识事务及MVCC_事务

redo log-持久性
重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性。
该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log file),前者是在内存中,后者在磁盘中。当提交之后会把所有修改信息都存到该日志文件中,用于在刷新脏页到磁盘,发生错误时,进行数据恢复使用。

undo log-原子性
回滚日志,用于记录数据被修改前的信息,作用包含两个:提供回滚和MVCC(多版本并发控制)
undo log和redo log 记录物理日志不一样,它是逻辑日志。可以认为当delete 一条记录时,undo log 中会记录一条对应的insert 记录,反之亦然,当update 一条记录时,它记录一条对应相反的update 记录。当执行rollback 时,就可以从undo log 中的逻辑记录读取到相应的内容并进行回滚。
undo log 销毁:undo log 在事务执行时产生,事务提交时,并不会立即删除undo log,因为这些日志可能还用于MVCC.
undo log存储:undo log采用段的方式进行管理和记录,存放在前面介绍的rollback segment 回滚段中,内部包含1024个undo log segment

 

 

MVCC Multi-Version Concurrency Control

  1. 本并发控制。它是一种并发控制方法,一般在数据库管理系统中,实现数据库的并发访问,在编程语言中实现事务内存;维护一个数据的多个版本,使得读写操作没有冲突,快照读为MySQL实现MVCC提供了一个非阻塞读功能。MVCC的具体实现,还需要依赖于数据库记录中的三个隐士字段,undo log 日志,readview。

 

 

当前读

读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如:select 。。lock in share mode, select ... for update,update ,insert,delete(排他锁)都是一种当前读。

 

快照读

简单的select(不加锁)就是快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。

 

read committed :每次 select,都生成一个快照读。

repeatable read :开启事务后第一个select 语句才是快照读的地方

serializable :快照读会退化为当前读

 

 

隐藏字段

DB_TRX_ID :最近修改事务Id,记录插入这条记录或者最后一次修改该记录的事务ID.

DB_ROLL_PTR : 回滚指针,指向这条记录的上个版本,用于配合undo log,指向上一个版本

DB_ROW_ID: 隐藏主键,如果表结构没有指定主键,将会生成该隐藏字段

 

 

undo log

回滚日志,在insert,update,delete的时候产生的便于数据回滚的日志

当insert 的时候,产生的undo log日志只在回滚时需要,在事务提交后,可被立即删除

而update、delete的时候,产生的undo log日志不仅在回滚时需要,在快照读时也需要,不会立即删除

 

 

 ibd2sdi stu.ibd ,查看到的表结构信息中,有一栏columns,在其中我们会看到处理我们建表时指定的字段以外,还有额外的两个字段分别是:DB_TRX_ID 、 DB_ROLL_PTR ,因为该表有主键,所以没有DB_ROW_ID隐藏字段

 

1. 原始表

  • DB_TRX_ID : 代表最近修改事务ID,记录插入这条记录或最后一次修改该记录的事务ID,是自增的。
  • DB_ROLL_PTR : 由于这条数据是才插入的,没有被更新过,所以该字段值为null。
  1. 版本链

不同事务或相同事务对同一条记录进行修改,会导致该记录的undolog生成一条记录版本链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录。

 

 

 

readview

  1. dView(读视图)是快照读SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id。ReadView中包含了四个核心字段:

字段 含义

m_ids 当前活跃的事务ID集合

min_trx_id 最小活跃事务ID

max_trx_id 预分配事务ID,当前最大事务ID+1(因为事务ID是自增的)

creator_trx_id ReadView创建者的事务ID

 

规则(trx_id 代表当前undolog版本链对应事务ID )

条件 是否可以访问 说明

trx_id == creator_trx_id 可以访问该版本 成立,说明数据是当前这个事 务更改的。

trx_id < min_trx_id 可以访问该版本 成立,说明数据已经提交了。

trx_id > max_trx_id 不可以访问该版本 成立,说明该事务是在 ReadView生成后才开启。

min_trx_id <= trx_id <= max_trx_id 如果trx_id不在m_ids中, 是可以访问该版本的 成立,说明数据已经提交。

  1. 不同的隔离级别,生成ReadView的时机不同:
  2. READ COMMITTED :在事务中每一次执行快照读时生成ReadView。
  3. REPEATABLE READ:仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView。
  4. RC隔离级别

同一个事务,每次查询都需要计数并生成readview

  1. RR隔离级别

同一个事务,仅在事务第一次执行快照读的时候生产readview,后续复用该readview

 

 

总结:

逻辑存储结构

表空间、段、区、页、行

 

架构

内存结构

磁盘结构

 

事务原理

原子性-undo

持久性-redo

一致性-undo log+redo log

隔离性-锁+MVCC

 

MVCC

记录隐藏字段、undo log版本链、readview

举报

相关推荐

0 条评论