万隆的笔记 万隆的笔记
博文索引
笔试面试
  • 在线学站

    • 菜鸟教程 (opens new window)
    • 入门教程 (opens new window)
    • Coursera (opens new window)
  • 在线文档

    • w3school (opens new window)
    • Bootstrap (opens new window)
    • Vue (opens new window)
    • 阿里开发者藏经阁 (opens new window)
  • 在线工具

    • tool 工具集 (opens new window)
    • bejson 工具集 (opens new window)
    • 文档转换 (opens new window)
  • 更多在线资源
  • Changlog
  • Aboutme
GitHub (opens new window)
博文索引
笔试面试
  • 在线学站

    • 菜鸟教程 (opens new window)
    • 入门教程 (opens new window)
    • Coursera (opens new window)
  • 在线文档

    • w3school (opens new window)
    • Bootstrap (opens new window)
    • Vue (opens new window)
    • 阿里开发者藏经阁 (opens new window)
  • 在线工具

    • tool 工具集 (opens new window)
    • bejson 工具集 (opens new window)
    • 文档转换 (opens new window)
  • 更多在线资源
  • Changlog
  • Aboutme
GitHub (opens new window)
  • MySQL

  • 架构原理

  • 索引与优化

  • 事务和锁

    • 事物ACID特性
      • 原子性
      • 持久性
      • 隔离性
      • 一致性
    • 事务控制的演进
    • 事务隔离级别
    • MySQL锁机制
    • 死锁与解决方案
  • 集群架构

  • MySQL
  • 事务和锁
2022-03-22
目录

事物ACID特性

# 事物ACID特性

在关系型数据库管理系统中,一个逻辑工作单元为事务。它必须满足ACID特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

# 原子性

原子性:事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。

事物流程:SQL修改 -》Buffer Pool修改 -> 刷盘。可能会有下面两种情况:

  • 事务提交了,如果此时Buffer Pool的脏页没有刷盘,如何保证修改的数据生效? Redo
  • 如果事务没提交,但是Buffer Pool的脏页刷盘了,如何保证不该存在的数据撤销?Undo

每一个写事务,都会修改BufferPool,从而产生相应的Redo/Undo日志,在Buffer Pool 中的页被刷到磁盘之前,这些日志信息都会先写入到日志文件中。如果 Buffer Pool 中的脏页没有刷成功,此时数据库挂了,那在数据库再次启动之后,可以通过 Redo 日志将其恢复出来,以保证脏页写的数据不会丢失。如果脏页刷新成功,此时数据库挂了,就需要通过Undo来实现了。

# 持久性

持久性:指的是一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,后续的操作或故障不应该对其有任何影响,不会丢失。

如下图所示,一个“提交”动作触发的操作有:binlog落地、发送binlog、存储引擎提交、flush_logs,check_point、事务提交标记等。这些都是数据库保证其数据完整性、持久性的手段。

acid_1.png

MySQL的持久性也与WAL(Write Ahead Log,预写日志)技术相关,redo log在系统Crash重启之类的情况时,可以修复数据,从而保障事务的持久性。通过原子性可以保证逻辑上的持久性,通过存储引擎的数据刷盘可以保证物理上的持久性。

# 隔离性

隔离性:指的是一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对其他的并发事务是隔离的。

InnoDB 支持的隔离级别有 4 种,隔离性从低到高分别为:读未提交、读提交、可重复读、可串行化。

锁和多版本控制(MVCC)技术就是用于保障隔离性的。

# 一致性

一致性:指的是事务开始之前和事务结束之后,数据库的完整性限制未被破坏。通常一致性包括两方面的内容,分别是约束一致性和数据一致性。

  • 约束一致性:创建表结构时所指定的外键、Check、唯一索引等约束,可惜在 MySQL 中不支持Check 。
  • 数据一致性:是一个综合性的规定,因为它是由原子性、持久性、隔离性共同保证的结果,而不是单单依赖于某一种技术。

MySQL的一致性通常是指数据一致性,可理解为数据的完整性。上面提到数据的完整性是通过原子性、隔离性、持久性来保证的,而MySQL(InnoDB)这3个特性又是通过 Redo/Undo 来保证的。而约束(逻辑上)的一致性,包括唯一索引、外键约束、check 约束,这属于业务逻辑范畴。

acid_2.png

ACID 及它们之间的关系如下图所示,4个特性中有3个与 WAL(Write Ahead Log,预写日志,再写磁盘)有关系,都需要通过 Redo、Undo日志来保证等。 acid_3.png

上次更新: 5/30/2023, 11:09:19 PM
事务控制的演进

事务控制的演进→

最近更新
01
2025
01-15
02
Elasticsearch面试题
07-17
03
Elasticsearch进阶
07-16
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式