Skip to content

事务

事务是指一组操作集合,操作集合中的操作要么全部执行成功,要么全部不执行。事务具有四个特性,简称 ACID 特性:

  • 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成。
  • 一致性(Consistency):事务执行前后,数据库必须处于一致的状态。
  • 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
  • 持久性(Durability):一旦事务提交,对数据库的修改就是永久性的。

并发事务常见问题

脏读

脏读是指一个事务读取了另一个事务未提交的数据。如果后者事务回滚,前者读取的数据就变得无效。

脏读

在上图中,事务A读取了事务B未提交的money值,如果事务B回滚,事务A读取的数据就变得无效。

不可重复读

不可重复读是指在同一个事务中,两次读取同一数据时,数据发生了变化,导致两次读取结果不同。

不可重复读

在上图中,事务A两次读取到的money值不同,因为事务B在两次读取之间修改了money值并提交了事务

幻读

幻读是指在一个事务中,两次执行相同的查询语句时,由于另一个事务插入了新的数据,导致第一次查询结果和第二次查询结果不一致。

幻读

TIP

幻读:同一事务内,多次范围查询,结果集的“行数”发生变化
不可重复读:同一事务内,多次读取同一行数据,内容发生变化


事务隔离级别

MySQL 支持以下四种事务隔离级别(安全性从低到高,性能从高到低):

隔离级别脏读不可重复读幻读说明
读未提交(Read Uncommitted)最低级别,允许读取未提交数据
读已提交(Read Committed)仅读取已提交数据,避免脏读
可重复读(Repeatable Read)MySQL 默认级别,避免脏读和不可重复读
串行化(Serializable)最高级别,完全避免并发问题,性能较低
  • 读未提交(Read Uncommitted):最低的隔离级别,一个事务可以读取另一个事务未提交的数据,可能导致脏读。
  • 读已提交(Read Committed):一个事务只能读取另一个事务已提交的数据,避免脏读,但可能导致不可重复读。
  • 可重复读(Repeatable Read):一个事务在整个过程中多次读取同一数据,结果是一致的,避免不可重复读,但可能导致幻读。MySQL 默认隔离级别。
  • 串行化(Serializable):最高的隔离级别,事务按顺序执行,完全避免并发问题,但性能较低。
  • 查看当前会话隔离级别:
    sql
    SELECT @@tx_isolation;
  • 修改当前会话隔离级别:
    sql
    SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别;

Released under the MIT License.