MySQL技术内幕:InnoDB存储引擎(第7章事务)

MySQL技术内幕:InnoDB存储引擎(第7章事务)

7.1认识事务

7.1.1概述(ACID)

事务会把数据库 从一种一致状态转换为另一种一致状态。

  • Atomicity原子性

    指整个数据库事务是不可分割的工作单位。要么全部成功,要么全部失败。

  • Consistency一致性

    指事务将数据库从一种状态转变为下一种一致的状态。(事务开始前和结束后,数据库的完整性约束没有被破坏)

  • Isolation隔离性

    事务提交前对其他事务不可见。一般为加锁策略。

  • Durability持久性

    事务一旦提交,其结果就是永久性的,即使宕机也能恢复数据,保证事务系统的高可靠性(high reliability),而不是高可用性(high availability)。

7.1.2分类

  • 扁平事务
  • 带保存点的扁平事务
  • 链事务
  • 嵌套事务
  • 分布式事务

7.2事务的实现

原子性、一致性、持久性通过数据库的redo log和undo log来完成。
redo log保证事务的原子性和持久性
undo log保证事务的一致性

7.2.1redo

保证事务的持久性,顺序写,数据库运行时不需要读取redo log文件。
事务提交时,必须先将该事务所有日志(redo、undo)写入到重做日志文件进行持久化,待事务的commit操作完成才算完成。

  • 重做日志内存缓存(redo log buffer)

  • 重做日志文件(redo log file)

  • innodb_flush_log_at_trx_commit

    默认1;
    0.仅在master thread中写重做日志
    1.每次事务提交都写重做日志(fsync),强制落盘
    2.每次事务提交只写到系统缓冲区,等系统落盘

  • log block(日志块,512字节)

    重做日志块大小和磁盘扇区大小一样,都是512字节,因此重做日志的写入可以保证原子性,不需要double write技术。
    一个块可能记录多个事务。

  • log group(重做日志组)

    多组互为镜像,mysql只支持一个组,一个组有多个日志文件。
    两个文件轮流写入。
    其中一个有redo log file header(2K)记录checkpoint信息,有两个checkpoint记录,防止丢失。

    • 刷盘规则

      1.事务提交
      2.log buffer有一半内存空间已被使用
      3.log checkpoint时

    • 在这里插入图片描述

  • 格式

    • 在这里插入图片描述
  • LSN(log sequence number)日志序列号,8字节,单增

    1.重做日志写入总量
    2.checkpoint位置
    3.页的版本

  • 恢复(图)

    仅需恢复checkpoint开始的日志部分。重做日志是物理日志,恢复速度很快。

    • 在这里插入图片描述

7.2.2undo

有一个history列表,根据事务提交的顺序将undo进行链接。

  • 基本概念

    位置:
    存放在特殊端(segment)中,undo段,位于共享表空间。
    作用:
    1.是逻辑日志,将数据库逻辑的恢复到原来的样子(回滚)。
    2.MVCC,通过undo读取之前的版本信息,实现非锁定读。
    持久性:
    undo也会产生redo log,需要持久性保护。
    保证事务的一致性,帮助事务回滚及MVCC功能,需要进行随机读写。(rollback回滚)。

  • undo管理

    1个rollback segment -》 1024个undo log segment -》 申请undo页。
    参数:
    innodb_undo_directory:文件所在路径(没有默认在共享表空间)
    innodb_undo_logs:rollback segment个数,默认128
    innodb_undo_tablespaces:设置构成rollback segment文件的数量,这样rollback segment可以较平均的分布在多个文件中。

    • 事务提交时触发undo操作

      删除和重用:
      1.将undo log放入列表中,以供之后的purge操作(事务提交后不能马上删除undo,因为可能还有其他事务在使用undo得到之前的版本,顾将其放到链表中,后续由purge判断删除)
      2.判断undo log所在页是否可以重用(使用空间是否小于3/4),若可以分配给下一个事务使用

7.2.3purge

最终完成delete和update操作。
参数:innodb_purge_batch_size,不建议调整

  • 清理顺序

    先从history list中找undo,再从undo page中找undo log,避免大量随机去取操作,提高purge效率

7.2.4group commit(fsync)

批量将重做日志、二进制日志写入到文件中,提高性能。

  • BLGC(二进制日志批量提交)
  • GC(重做日志批量提交)

redo和undo的区别

保证:
redo log保证事务的原子性和持久性;
undo log保证事务的一致性
恢复:
redo恢复提交事务修改的页操作;undo回滚行记录到某个特定版本;
内容:
redo是物理日志,记录页的物理修改操作;
undo是逻辑日志,根据每行记录进行记录。

7.3事务控制语句

begin

start transaction

rollback

savepoint identifier

release savepoint identifier

set transaction

设置隔离级别:
read uncommit,read committed,repeatable read,serialiable

7.4隐式提交的SQL语句

DDL

各类alter,create,drop,rename,truncate等

用来隐式修改mysql架构操作

各类权限管理

管理语句

7.5对事务操作的统计

QPS(每秒请求数)

TPS(每秒事务处理能力)

计算公式:(com_commit+com_rollback)/time

7.6事务的隔离级别

查看隔离级别:
select @@global.tx_isolation;

read uncommit

read committed

repeatable read

serialiable

7.7分布式事务

XA事务来支持分布式事务

  • RMs

    资源管理器(Resource Managers),提供访问事务资源的方法。通常就是一个数据库

  • TM

    事务管理器(Transaction Manager),协调参与全局事务中的各个事务。需要和参与全局事务的所有资源管理器进行通信。

  • AP

    应用程序(Application Program),定义事务的边界,指定全局事务的操作。

  • 二阶段提交two-phase commit

    • 准备prepare
    • 提交commit或回滚rollback
  • 模型图

    • 在这里插入图片描述

7.8不好的事务习惯

7.8.1在循环中提交

在最后提交事务

7.8.2使用自动提交

设置为手动提交

7.8.3使用自动回滚

使用显示回滚

7.9长事务

将大事务拆分为大小合适的事务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值