什么是事务

事务 (Transaction),准确的来说应该是数据库事务 (Database Transaction),是数据库管理系统中单个逻辑单元或工作单元 (a single unit of logic or work),通常由多个操作组成。举一个典型的例子,从一个银行账户转账到另一个账户:完成交易需要从一个账户减去转账金额,并将相同金额添加到另一个账户中。

事务从定义上来看,必须具有四大基本属性:

  • 原子性 (Atomicity)
  • 一致性 (Consistency)
  • 隔离性 (Isolation)
  • 持久性 (Durability)
    这四个属性简称为 ACID,主要目的是确保数据在错误、断电和其他意外中仍然有效。

原子性 (Atomicity)

事务通常由多个操作(多条语句)组成,原子性确保一个事务是一个逻辑(工作)单元。也就是说,这项事务要么成功,要么失败,没有其他中间状态。如果在执行事务中的某一条语句时发生错误导致事务不能完成,那么这个事务就是失败的,数据库的状态将保持不变。原子性可防止对数据库的部分更新。因此,事务不能被其他数据库客户端(除了执行这个事务的客户端以外的客户端)观察到正在进行。在某个时刻,它尚未发生,在下一个时刻,它已经全部发生(或者如果该事务在进行中被取消,则什么也没有发生)。

一致性 (Consistency)

一致性确保一个事务只能将数据库从一个一致状态带到另一个状态,保证数据库不变性:写入数据库的任何数据都必须根据所有定义的规则(包括约束、级联、触发器以及这些规则的任何组合)而有效。

隔离性 (Isolation)

事务通常是并发执行的,也就是说,多个事务会同时读写一张表。隔离性就是要保证事务并发执行后数据库的状态结果与事务顺序执行后数据库的状态结果一样。

持久性 (Durability)

持久性保证事务提交后是对数据库所作的更改是永久的,即使是系统发生故障也不会丢失。通常来说,就是已完成的事务被记录在非易失性记忆体(如磁盘)中。

MySQL/MariaDB 中的事务

在 MySQL/MariaDB 中,事务是由引擎实现的。在 MySQL 8.0 中,支持事务的引擎只有 InnoDB;而在 MariaDB 10.11 中,支持事务的引擎有 InnoDBSEQUENCE。因此,下文主要介绍 InnoDB 实现的事务。

  • MySQL 通过 Undo log回滚实现原子性
  • MySQL 通过 多版本并发控制 (MVCC) 或 锁机制来实现隔离性
  • MySQL 通过 Redo log 来实现持久性
最后修改:2024 年 05 月 03 日
如果觉得我的文章对你有用,请随意赞赏