本文更新于 2026-04-02
简介
事务是一组 SQL 语句组成的逻辑处理单元。这组操作要么全部执行成功,要么全部失败回滚,不能只执行其中的一部分
典型场景:银行转账。A 账户减 100 元,B 账户加 100 元。这两个操作必须同时成功,否则钱就“凭空消失”了
事务操作
- 在 MySQL 中,默认是 自动提交 (autocommit) 的。
- 查看/设置自动提交:
SELECT @@autocommit;(1为自动, 0为手动) - 开启事务:
START TRANSACTION;或BEGIN; - 提交事务:
COMMIT;(将更改永久保存到数据库) - 回滚事务:
ROLLBACK;(撤销所有未提交的操作,恢复到事务开始前的状态) 1.修改提交方式
SELECT @@autocommit; -- 查看当前的自动提交状态
SET @@autocommit = 0; -- 关闭自动提交
SELECT * FROM account WHERE name = '张三';
-- 查询姓名为张三的账户信息
UPDATE account SET money = money - 1000 WHERE name = '张三';
-- 给张三的账户减少1000元
报错语句...;
UPDATE account SET money = money + 1000 WHERE name = '李四';
-- 给李四的账户增加1000元
ROLLBACK ; -- 回滚事务,撤销之前的修改
COMMIT; -- 提交事务,保存修改
2.开启事务的方式
START TRANSACTION; -- 开始一个新的事务
...同上
事务的四大特性 (ACID)
这是数据库事务的基石,必须死记硬背:
原子性 (Atomicity):事务是最小的执行单位,不可分割。要么全部完成,要么全部不执行。
一致性 (Consistency):事务执行前后,数据库从一个一致性状态转换到另一个一致性状态(如转账前后总金额不变)
(事务完成时必须是所有的数据保持一致状态)
隔离性 (Isolation):并发访问数据库时,多个事务之间相互隔离,互不干扰(通过锁机制和多版本并发控制
MVCC实现)持久性 (Durability):一旦事务提交或回滚,其对数据库中数据的改变就是永久性的,即使系统崩溃也不会丢失。
ROLLBACK 符合持久性,是因为:
结果永久化: 回滚后的数据状态和提交后的状态一样,都受到系统故障保护,不会在重启后失效。
物理一致性: 数据库确保了“回滚”这一决策在物理磁盘上是完整执行且不可逆转的。
并发事务引发的问题
当多个事务同时操作同一批数据时,如果不加控制,会产生以下问题:
脏读 (Dirty Read):一个事务读取到了另一个事务尚未提交的数据
类似于:读到了草稿纸上的数据
不可重复读 (Non-Repeatable Read):一个事务先后读取同一条记录,但两次读取的数据不同(中间有另一个事务更新并提交了该数据)。
幻读 (Phantom Read):一个事务按照条件查询数据时,没有对应的数据行,但在插入数据时又发现这行数据已经存在(中间有另一个事务插入并提交了数据)。
- 类似于:更改密码的时候不可以使用旧密码
事务隔离级别
- 为了解决上述并发问题,数据库提供了四种隔离级别。级别越高,数据越安全,但并发性能越低。
| 隔离级别(√表示会出现) | 脏读 | 不可重复读 | 幻读 | 性能 |
|---|---|---|---|---|
| Read Uncommitted (读未提交) | √ | √ | √ | 最高 |
| Read Committed (读已提交) | × | √ | √ | 高(Oracle默认) |
| Repeatable Read (可重复读) | × | × | √ | 中 (MySQL默认) |
| Serializable (串行化) | × | × | × | 最低 |
注意:MySQL 的 InnoDB 引擎在
Repeatable Read级别下,通过间隙锁(Next-Key Locks)在很大程度上规避了幻读问题。
-- 查看事物隔离级别
SELECT @@TRAN_ISOLATION_LEVEL;
-- 设置事务隔离级别
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL
[READ UNCOMMITTED|READ COMMITTED|
REPEATABLE READ|SERIALIZABLE];
-- 精简:‘’中不能有空格,用 - 代替
SET @@SESSION.TRANSACTION_ISOLATION = 'READ-COMMITTED |...';
事务原理简介
MySQL 如何实现 ACID?
- 原子性:由 undo log(回滚日志)保证。
- 持久性:由 redo log(重做日志)保证。
- 隔离性:由 锁机制 + MVCC(多版本并发控制)保证。
- 一致性:由原子性、持久性、隔离性共同支撑,外加数据库逻辑约束。
豫公网安备41019702004633号