MySQL-事务

事务的特性:原子性,一致性,持久性,隔离性。

MySQL中 原子性,一致性,持久性 基于 redo log和 undo log,隔离性基于锁和MVCC

redo log

分为两个部分:日志缓冲(内存中),日志文件(磁盘中)

记录事务提交数据页的物理修改,用于刷新脏页到磁盘发生错误时,进行数据恢复使用

发起一次事务操作后,MySQL会先查看缓冲区中是否存在需要修改数据的记录,如果没有通过后台线程拉取加载到内存中,然后会直接操作缓冲区中的数据,并将修改数据的操作记录到日志缓冲中,改数据页称之为脏页。事务提交后会将日志缓冲的数据直接同步到日志文件中。
脏页的数据会定时通过后台线程同步到磁盘中,当同步出错后可以基于redo log 来进行恢复。

image

这样可以提高性能,讲随机磁盘io变为有序磁盘io。(WAL)

undo log

回滚日志,用于记录数据被修改前的记录:提供回滚和多版本并发控制

MVCC

创建表结构时,MySQL会增加两个隐藏字段db_trx_id , db_roll_ptr

db_trx_id:记录最后一次修改改记录的id
db_roll_ptr:回滚指针,指向这个记录的上一个版本,用于配合undo log 指向上一个版本

undo log 版本链
image
image

readview

读视图:记录并维护系统当前活跃的事务(未提交)id,主要包含了四个字段
image

版本链数据访问规则:(trx_id 为当前事务id)
image

不同的隔离级别,生成的readView时机也不同

读已提交 隔离级别下,在事务中每一次执行快照读时生成readview
image

事务5中发生读操作是会先查找记录,查看最近的修改上一个版本 看是否符合访问规则,符合则返回,不符合再链式查找查找上上个版本知道符合为止。

可重复读隔离级别下,尽在事务第一次执行快照读取时生成readView , 后续会复用。

posted @   原来是晴天啊  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示