MySQL中的事务

本文深入探讨了MySQL中的事务,包括事务的定义、分类、ACID特性,以及事务的实现方式如WAL日志预写、Commit Log和Shadow Paging。详细解析了InnoDB的redo log和undo log在事务持久性和一致性中的作用,同时阐述了MVCC如何实现隔离性,以及锁机制在并发控制中的应用。此外,还讨论了事务的优化原则和断电后的恢复策略。
摘要由CSDN通过智能技术生成

MySQL中的事务

事务的定义

概念:数据库的事务(Transaction)是一种机制、一个操作序列,包含了一组数据库操作命令。事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行,因此事务是一个不可分割的工作逻辑单元。

就我的理解来说:简单的说事务就是一组同时执行成功或者同时执行失败的数据库操作命令。

事务的分类

  • 只读事务

    • 开启方式:START TRANSACTION READ ONLY语句开启一个只读事务
    • 特点:
      • 只读事务中不可以对普通的表(其他事务也能访问到的表)进行增、删、改操作
      • 但可以对用户临时表做增、删、改操作

【拓展】数据库中的临时表(出现在MySQL的3.23版本以后)

  • 作用:临时表有时候对于保存临时数据非常有用。临时表可以和普通表一样的进行操作,并且在当前的终端会话结束后被删除。
  • 操作:
    • 表创建:CREATE TEMPORARY TABLE tableName
    • 表删除:DROP TABLE tableName;
  • 读写事务(默认使用类型)

    • 开启方式:
      • START TRANSACTION READ WRITE语句开启一个读写事务
      • 或者直接使用 BEGIN、START TRANSACTION开启
        我们默认使用的就是读写事务
    • 特点:对普通表可以进行任何操作

事务的特性(ACID)

  1. 原子性(Atomicity):

    • 概念:一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
    • 我的理解:同一个事务中的操作最终执行状态一样(一组操作要么都成功,要么都失败)
  2. 持久性(Durable)

    • 概念:持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
    • 我的理解:一个事务中的修改内容可以永久的在磁盘中进行保存,即使系统出现故障也可以进行持久保存
  3. 隔离性(Isolation)

    • 概念:一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
    • 我的理解:每个事务的执行时互不影响,保证并发场景下的“环境独立”
  4. 一致性(Consistent)
    • 概念:事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
    • 我的理解:事务中更改的数据最终会保证所有数据读取出的结果和磁盘中的数据保证一致

特性之间的关系

事务中最重要的特性其实时一致性,一致性是开始事务的最终目的,而原子性、隔离性和持久性都是实现一致性的手段

事务实现的方式

WAL日志预写

先将修改内容写入到日志中,然后再同步到系统磁盘中,InnoDB就是通过这种方式实现的,日志包括undo log和redo log来实现事务;其中数据落盘成功前也可以进行数据的改动。
MySQL的InnoDB的事务就是使用这种方式实现的。

Commit Log提交日志

在日志落盘成功后才进行数据的修改;必须落盘成功再进行数据修改。
OceanBase数据库就使用的这种方式实现的。

Shadow Paging影子分页

使用写时复制的机制实现,再进修改操作时对修改数据做一个复制操作,在复制区域进行修改,修改完成后再进行内容的替换。
安卓开发中SQLLitte就是通过这种方式实现的。

事务特性实现的原理

  1. redo log:事务持久性实现的方法

    • redo日志作用:记录事务在执行过程中对数据库所做的数据修改
    • 使用redo日志记录变化的原因
      • 数据是存放在数据页中的,如果直接使用数据页进行记录的话,这样的记录方式会导致使用很多额外的空间来存储数据页中很多没有变化的数据;并且使用数据页的话,页会导致多次的随机IO导致处理效率降低
      • 但是redo日志只是进行改变行修改数
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值