MySQL学习目录
 
事务
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失效。
事务的特性:
1.原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
2.一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
3.隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
4.持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
InnoDB的ACID的实现原理如图:
0
redo log(保持数据的一致性和持久性)
重做日志,记录的是事务提交时数据页的物理修改,时用来实现事务的持久性。
该日志文件由两部分组成,重做日志缓冲区(redo log buffer)以及重做日志文件(redo log file),前者在内存中,后者在磁盘中。当事务提交之后,会把所有修改信息都存到该日志文件中,用于在刷新脏页到磁盘时,进行数据恢复使用。
0
大概的工作流程时,当提交事务后,InnoDB首先查看Buffer Pool中是否有需要操作的数据,如果没有,从磁盘中读取到Buffer Pool中,然后根据事务修改Buffer Pool中的数据,然后将数据变化存储到redo log bugger中,redo log buffer 将更改追加到磁盘中的redo log file中,Buffer Pool中的脏页数据正常更新到磁盘时,不会用到redo log file,当更新异常时,才会用到。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
基础概念
1.当前读
读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如:
select ...lock in share mode(共享锁),select ... for update,insert,delete(排他锁)都是一种当前读。
2.快照读
简单的select(不加锁)就是快照读,快照都读取的时记录数据的可见版本,有可能时历史数据,不加锁,是非阻塞读。
Read Committed:每次Select,都生成一个快照读。
Repeatable Read:开启事务后第一个select 语句才是快照读的地方。 就是事务中第一个select语句会生成一个快照,此后对该select语句中设计到的表的读取,都应该是基于快照,也就是快照之后产生的对表的更新,在此事务中的再次读取时,不会被查询到。
Serializable:快照读会退化为当前读。
3.MVCC
全程Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,是的读写操作没有冲突,快照读为MySQL实现MVCC提供了一个非阻塞读功能。MVCC的具体实现,还需要依赖于数据库记录中的三个隐藏字段,undo log日志,readView。
 
MVCC 隐藏字段
记录中的隐藏字段
0
其中DB_ROW_ID不是每个表都会创建的,只有没有设置主键的时候,才会自动创建。
 
undo log 版本链
undo log
回滚日志,在Insert,update,delete的时候产生的便于数据回滚的日志。
当insert的时候,产生发undo log 日志只在回滚的时候需要,在事务提交后,可被立即删除。
而update,delete的时候,产生的undo log 日志不仅在回滚的时候需要,在快照读的时候也需要,不会立即删除。
0
不同事务或相同事务对同一条记录进行修改,会导致该记录undolog生成一条记录版本链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录。
 
readview
ReadView(读视图)是快照读SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id。
ReadView中包含了四个核心字段:
0
0
不同的隔离级别,生成ReadView的时机不同:
1.READ COMMITTED(读已提交):在事务中每一次执行快照读时生成ReadView。
0
0
2.REPEATABLE READ(可重复读):仅在事务中的第一次执行快照读时生成ReadView,后续复用该ReadView。
0
0
 
posted on 2022-07-03 10:47  CRUDEngineer  阅读(42)  评论(0编辑  收藏  举报