首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >mysql-innodb的事务

mysql-innodb的事务

原创
作者头像
一只羊羊
修改2025-06-18 11:14:56
修改2025-06-18 11:14:56
1230
举报
文章被收录于专栏:mysqlmysql

事务分类

扁平事务

扁平事务是指事务开始,提交,回滚都是原子的,要么同一提交,要么统一回滚

带有保存点的扁平事务

除了支持扁平分支支持的操作外,允许在事务执行过程中回滚到同一事务较早的一个状态

链事务

链事务是指将多个子事务以链状连接起来。与带保存点的扁平事务不同的是一个子事务失败整个回滚,与多个扁平事务不同的是对多个子事务会进行管理,避免在部分环节失败后前面的子事务已提交完成

嵌套事务

嵌套事务类似于事务组成的树

  • 子树既可以是嵌套事务,也可以是扁平事务
  • 叶节点一定是扁平事务,且每个子事务从跟到叶节点的距离可以是不同的
  • 位于根节点的事务称为顶层事务
  • 子事务既可以提交也可以回滚,但操作要等到父事务提交后才会生效

分布式事务

通常是在分布式环境下允许扁平事务

事务相关的日志

事务执行过程中的log

  • 执行写的sql
  • 将旧值写入undo log
  • 修改内存中的数据
  • 写入redo log buffer,并标记为未提交
  • 提交事务,写入binlog缓冲
  • 将redo log持久化到磁盘(是否立刻刷盘取决于刷盘策略的参数)

redo日志

  • redo log是acid的d(持久性),主要用作数据库的数据恢复
  • 针对页的修改,比如 page(2,3) offset 40 values 10, 故在数据恢复时速度会更快
  • redo log属于循环使用的,lsn和checkpoint的关系?待补充
  • redo log包含 redo log buffer(内存) 和 redo log file(磁盘)
    • 刷盘策略参数,决定同步刷盘或者异步刷盘(异步刷盘可能会出现少量数据丢失)
    • redo log过大,导致刷盘
    • checkpoint检测

二进制日志

  • 主要用于主从同步,逻辑维度
  • 事务执行commit或者隐形提交时,会写入binlog缓存,减少磁盘i/o
  • 主要包含sql模式、基于行的数据修改模式,或者混合模式
    • sql模式日志体积较小
    • 行数据修改的日志体积较大,但具有高度一致性
    • 混合模式,默认记录sql,但针对不确定sql时,则使用行数据修改模式,比如动态sql,或者sql带有表达式之类的

undo log

  • 主要用于事务数据回滚和提供mvcc读视图版本
  • undo log主要基于主键索引的数据页里面的行信息里携带的undo链信息,指向undo log链,undo log链基于行维度
  • undo log在写入旧值后,此时位于buffer中,然后也会将undo log的变动写入redo log,避免undo log丢失后,数据恢复时无法使用mvcc
  • undo log信息
    • insert 记录 insert info t () value () ,回滚时直接执行delete命令
    • delete 记录 delete from t where id=1 +完整列数据 回滚时直接执行insert命令
    • update 记录 update t set a = 9 where id=1 + a之前的旧值, 回滚时直接用旧值覆盖新值

读视图

可重复读隔离级别读视图

  • 读视图元素:
    • 活跃事务(指未提交的事务id,包含大于当前事务的id或者小于当前事务的id,但都未提交,不包含当前事务)
    • 生成读视图时最大的已提交版本的id low_limit_id(max_trx_id)
    • up_limit_id,生成读视图时最大的事务id
  • 读视图可见性规则
    • 通过找到聚簇索引对应的行数据记录,再根据行记录中的指向undo log链
    • 如果undo log链上的事务id为活跃事务,则数据不可见,继续找undo log的下一个节点
    • 如果undo log链上的事务id大于当前事务id,则数据不可见
    • 如果undo log链上的事务id大于low_limit_id(也就是大于生成视图时的已提交的最大事务id)
    • 如果undo log链上的事务id等于当前id,则可见,在这个过程中及时当前事务做了修改,对于自身事务也是可见的
    • 排除上述情况后则可见
  • 注意:虽然可重复读是为了解决不可重复读的问题,但只是针对快照读来解决不可重复读的问题,混合当前读的话也有极小概率出现不可重读问题,比如a事务快照读行1(主键), b事务修改行1(主键)后并提交,此时a事务执行当前读行1,则会读到b事务的修改数据

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 事务分类
    • 扁平事务
    • 带有保存点的扁平事务
    • 链事务
    • 嵌套事务
    • 分布式事务
  • 事务相关的日志
    • 事务执行过程中的log
    • redo日志
    • 二进制日志
    • undo log
    • 读视图
    • 可重复读隔离级别读视图
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档