事务
2025年12月15日大约 2 分钟
事务
事务是一组操作的集合,是一个不可分割的工作单位。
事务会把所有的操作作为一个整体向系统提交或撤销操作请求,这些操作要么全部成功,要么全部失败。
简单来说,事务就是一组操作的集合,这些操作要么全部执行成功,要么全部执行失败。
提示
MySQL的事务是自动提交的,也就是说当执行一条DML语句,MySQL会立即隐式提交事务。
事务操作
开始事务
使用START TRANSACTION或BEGIN语句开始一个事务。
START TRANSACTION;
-- 或者
BEGIN;提交事务
使用COMMIT语句提交事务,将所有操作保存到数据库中。
COMMIT;回滚事务
使用ROLLBACK语句回滚事务,撤销自事务开始以来的所有操作。
ROLLBACK;事务的四大特性(ACID)
- 原子性(Atomicity):事务是不可分割的最小单元,要么全部执行成功,要么全部失败。
- 一致性(Consistency):事务完成时,必须使所有数据保持一致的状态。
- 隔离性(Isolation):多个事务并发执行时,一个事务的操作对其他事务是不可见的。
- 持久性(Durability):一旦事务提交或回滚,对数据库的修改是永久性的,即使系统崩溃也不会丢失。
并发事务问题
| 问题类型 | 描述 |
|---|---|
| 脏读(Dirty Read) | 一个事务读取了另一个未提交事务修改的数据。 |
| 不可重复读(Non-repeatable Read) | 一个事务在两次读取同一数据时,另一个事务修改了该数据,导致两次读取结果不同。 |
| 幻读(Phantom Read) | 一个事务在查询操作时,没有对应的数据行,但另一个事务插入了符合查询条件的新行,当第一个事务插入时,数据行已经存在。 |
事务隔离级别
事务隔离级别目的是解决并发事务问题。
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| 读未提交(Read Uncommitted) | 是 | 是 | 是 |
| 读已提交(Read Committed) | 否 | 是 | 是 |
| 可重复读(Repeatable Read)默认 | 否 | 否 | 是 |
| 串行化(Serializable) | 否 | 否 | 否 |
注意
在MySQL中,默认的事务隔离级别是可重复读(Repeatable Read),其他的数据库可能不同。
查看当前隔离级别
SELECT @@transaction_isolation;设置隔离级别
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE};注意
事务隔离级别越高,数据越安全。但是性能会降低。