事务特性

事务四大特性及其实现

事务的四大特性(ACID)是数据库事务的核心原则:

  1. 原子性(Atomicity)

    • 定义:事务是一个不可分割的操作单元,要么全部执行成功,要么全部回滚。
    • 实现:通过 Undo Log 实现回滚操作,确保事务失败时恢复到初始状态。
  2. 一致性(Consistency)

    • 定义:事务执行前后,数据库的状态必须保持一致,满足所有的完整性约束。
    • 实现:通过约束(如主键、外键、唯一性约束)和触发器等机制,确保数据一致性。
  3. 隔离性(Isolation)

    • 定义:多个事务并发执行时,一个事务的中间状态对其他事务不可见。
    • 实现:通过锁机制(行锁、表锁)或 MVCC(多版本并发控制) 实现隔离。
  4. 持久性(Durability)

    • 定义:事务一旦提交,其结果将永久保存在数据库中,即使系统崩溃也不会丢失。
    • 实现:通过 Redo Log 记录已提交事务的操作,确保系统崩溃后可以恢复数据。

MySQL 隔离级别有哪些

MySQL 提供了四种事务隔离级别,从低到高依次为:

  1. 读未提交(Read Uncommitted)

    • 一个事务可以读取到其他事务未提交的数据。
    • 问题:可能出现脏读、不可重复读和幻读。
  2. 读已提交(Read Committed)

    • 一个事务只能读取到其他事务已提交的数据。
    • 问题:解决了脏读,但仍可能出现不可重复读和幻读。
  3. 可重复读(Repeatable Read)(MySQL 默认隔离级别)

    • 一个事务在开始时读取到的数据,在整个事务中保持一致。
    • 问题:解决了脏读和不可重复读,但可能出现幻读。
    • 实现:通过 MVCC(多版本并发控制)解决幻读问题。
  4. 可串行化(Serializable)

    • 强制事务按顺序执行,完全避免了脏读、不可重复读和幻读。
    • 问题:性能较低,可能导致大量锁等待。

默认隔离级别是哪个?可能面临什么问题?

  • 默认隔离级别
    MySQL InnoDB 存储引擎的默认隔离级别是 可重复读(Repeatable Read)

  • 可能面临的问题

    • 在可重复读隔离级别下,可能出现 幻读 问题。
    • 幻读:指一个事务在两次查询之间,其他事务插入了新数据,导致第二次查询结果与第一次不同。
  • 解决方法
    MySQL 使用 Next-Key Lock(间隙锁) 机制解决幻读问题。间隙锁会锁住查询范围内的记录及其间隙,防止其他事务插入新数据。


脏读、不可重复读和幻读的区别

类型 定义 解决方式
脏读 一个事务读取到另一个事务未提交的数据。 使用 读已提交 或更高隔离级别
不可重复读 一个事务在两次读取同一数据时,结果不同(数据被其他事务修改)。 使用 可重复读 或更高隔离级别
幻读 一个事务在两次查询时,结果集的行数不同(其他事务插入了新数据)。 使用 可串行化 或间隙锁(Next-Key Lock)

通过理解事务的四大特性、MySQL 的隔离级别及其问题,可以更好地设计和优化数据库事务,确保数据的一致性和可靠性。