MySQL事务小记

Transactions are atomic units of work that can be committed or rolled back. When a transaction makes multiple changes to the database, either all the changes succeed when the transaction is committed, or all the changes are undone when the transaction is rolled back. Database transactions, as implemented by InnoDB, have properties that are collectively known by the acronym ACID, for atomicity, consistency, isolation, and durability.

事务是数据库工作任务的原子单元,它可用被提交或者回滚。当一个事务对数据库做了多次修改,所有的修改在事务提交的时候都会执行成功,或者在事务回滚的时候,全部取消。InnoDB实现的数据库事务拥有ACID的特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

---- MySQL 8.4参考手册

ACID

  • 原子性(Atomicity):一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。

  • 一致性(Consistency):在事务处理的前后,数据库必须从一个一致性的状态转换到另外一个一致性的状态。包括:唯一键、外键、trigger、数据类型等数据约束。

  • 隔离性(Isolation):通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。

  • 持久性(Durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。

隔离级别

级别

说明

问题

READ UNCOMMITTED(未提交读)

一个事务可用读取到另一个事务未提交的数据

Dirty Read(脏读)

READ COMMITTED(提交读)

一个事务只能看到其他事务已提交的数据,Oracle默认隔离

Nonrepeatable Read(不可重复读)

REPEATABLE READ(可重复读)

同一个事务中多次读取同一条记录结果一致,MySQL InnoDB的默认级别

Phantom Read(幻读)

SERIALIZABLE(可串行化)

读取的每一行数据都会加锁,避免幻读

可能产生大量的超时和锁争用的

参考

Comment