Wrayの知识库 Wrayの知识库
首页
  • Java 基础
  • Java 集合
  • Java 并发
  • Java IO
  • JVM
  • Spring Framework
  • Spring Boot
  • Spring Cloud
  • Spring Security
  • MySQL
  • Redis
  • MacOS
  • Linux
  • Windows
  • 纸质书
  • 电子书
  • 学习课程
疑难杂症
GitHub (opens new window)
首页
  • Java 基础
  • Java 集合
  • Java 并发
  • Java IO
  • JVM
  • Spring Framework
  • Spring Boot
  • Spring Cloud
  • Spring Security
  • MySQL
  • Redis
  • MacOS
  • Linux
  • Windows
  • 纸质书
  • 电子书
  • 学习课程
疑难杂症
GitHub (opens new window)
  • MySQL

    • MySQL概述
    • MySQL基础架构
    • MySQL存储引擎
    • MySQL事务
      • 事务的基本概念
      • MySQL 中的事务管理
      • InnoDB 与事务支持
        • 1. 重做日志(Redo Log)
        • 2. 回滚日志(Undo Log)
        • 3. 两阶段提交
      • 事务的隔离级别
      • 死锁与事务管理
      • 事务的最佳实践
      • 总结
    • MySQL索引
    • MySQL B+索引
    • MySQL锁
    • MySQL日志
  • Redis

    • Redis概述
    • Redis版本
    • Redis相较于其他NoSQL数据库
    • Redis数据类型
    • Redis命令
    • Redis持久化机制
    • Redis缓存管理
    • Redis事务
    • Redis分布式锁
  • 数据库
  • MySQL
Wray
2024-11-01
目录

MySQL事务

在 MySQL 中,事务是管理和控制数据库操作的一个重要机制,特别是在涉及多个表和多个步骤的复杂数据操作时,事务能够确保数据的完整性和一致性。MySQL 主要通过 InnoDB 存储引擎来支持事务,具备 ACID 特性,是保证数据可靠性的关键工具。

# 事务的基本概念

事务(Transaction)是指一组数据库操作,要么全部执行成功,要么全部回滚到初始状态。事务的核心思想就是保证数据的一致性和完整性。为了实现这一目标,事务通常具有以下四个重要特性(ACID):

  • 原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败,不会出现部分成功的情况。
  • 一致性(Consistency):事务执行前后,数据库保持一致性状态。无论发生什么问题,数据必须满足数据库的完整性约束。
  • 隔离性(Isolation):多个事务并发执行时,彼此之间不会相互干扰,每个事务的中间状态对其他事务是不可见的。
  • 持久性(Durability):一旦事务提交,其对数据库的更改会永久保存下来,即使系统崩溃也不会丢失。

# MySQL 中的事务管理

MySQL 提供了一些 SQL 语句来管理事务,包括 START TRANSACTION、COMMIT 和 ROLLBACK。

  • START TRANSACTION:启动一个新事务,之后的操作都在这个事务内执行。
  • COMMIT:提交事务,将事务中的所有操作永久保存到数据库中。
  • ROLLBACK:回滚事务,撤销事务中的所有操作,使数据库恢复到事务开始之前的状态。

除了手动管理事务之外,MySQL 还支持自动提交模式。默认情况下,MySQL 处于自动提交模式,每执行一条 SQL 语句都会自动提交。如果要使用事务管理,需要关闭自动提交模式:

SET autocommit = 0;

或者使用 START TRANSACTION 显式启动事务。

# InnoDB 与事务支持

InnoDB 是 MySQL 的默认存储引擎,提供了强大的事务支持。InnoDB 存储引擎通过以下机制来实现对事务的支持:

# 1. 重做日志(Redo Log)

重做日志用于保证事务的持久性。在事务执行过程中,InnoDB 会先将事务的更改记录到重做日志中,再将数据写入磁盘。即使数据库在提交前出现故障,通过重做日志也可以恢复已提交的事务,确保数据不丢失。

# 2. 回滚日志(Undo Log)

回滚日志用于保证事务的原子性和隔离性。回滚日志记录事务执行的反向操作,如果事务需要回滚,InnoDB 可以通过回滚日志撤销已经执行的更改。

# 3. 两阶段提交

InnoDB 使用 两阶段提交 来确保事务的可靠性。两阶段提交包含两个步骤:首先将数据写入重做日志并标记为“准备提交”状态,然后在所有写入操作成功后正式提交。这种机制确保在发生故障时,可以通过重做日志恢复一致的数据库状态。

# 事务的隔离级别

在 MySQL 中,事务的隔离级别决定了一个事务与其他事务之间的隔离程度。SQL 标准定义了四种隔离级别,InnoDB 存储引擎也支持这四种级别:

  1. 读未提交(Read Uncommitted):一个事务可以读取另一个事务未提交的数据,可能会导致脏读(Dirty Read)。
  2. 读已提交(Read Committed):一个事务只能读取到另一个事务已经提交的数据,避免了脏读,但可能会发生不可重复读(Non-repeatable Read)。
  3. 可重复读(Repeatable Read)(默认级别):在一个事务内,多次读取同一数据的结果是一样的,避免了不可重复读。但可能会发生幻读(Phantom Read)。InnoDB 通过间隙锁(Gap Lock)来防止幻读。
  4. 可串行化(Serializable):最高的隔离级别,强制事务串行执行,完全避免了脏读、不可重复读和幻读,但性能较差,通常用于对一致性要求非常高的场景。

可以通过以下命令设置事务的隔离级别:

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

# 死锁与事务管理

在多事务并发的情况下,可能会出现 死锁。死锁是指两个或多个事务互相占用对方需要的资源,导致相互等待,无法继续执行下去。InnoDB 存储引擎可以自动检测死锁并进行回滚操作,以解除死锁。

  • 避免死锁的策略:
    • 合理设计索引:减少全表扫描,降低锁冲突的概率。
    • 按固定顺序访问资源:确保多个事务访问资源的顺序一致,减少死锁的可能性。
    • 降低锁定粒度:尽量使用行级锁而不是表级锁,以减少锁冲突。

# 事务的最佳实践

  • 合理设置隔离级别:根据应用场景选择合适的隔离级别,平衡数据一致性和系统性能。
  • 最小化事务范围:将事务中包含的 SQL 语句数量最小化,减少事务持有锁的时间,以提高并发性能。
  • 避免长时间持有锁:长时间运行的事务会占用大量资源,容易引起锁等待甚至死锁,应尽量避免。

# 总结

MySQL 的事务机制是保证数据一致性和完整性的关键手段,尤其是在多步骤、跨表操作的复杂应用中。通过 InnoDB 存储引擎,MySQL 实现了对事务的全面支持,包括重做日志、回滚日志、两阶段提交等机制,以及多种事务隔离级别和死锁检测功能。在实际应用中,合理使用事务可以显著提高数据库的可靠性和数据一致性。

上次更新: 2024/11/03, 18:32:44
MySQL存储引擎
MySQL索引

← MySQL存储引擎 MySQL索引→

Copyright © 2023-2024 Wray | 鄂ICP备2024050235号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式