MySQL | 事务

本文更新于 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 符合持久性,是因为:

  1. 结果永久化: 回滚后的数据状态和提交后的状态一样,都受到系统故障保护,不会在重启后失效。

  2. 物理一致性: 数据库确保了“回滚”这一决策在物理磁盘上是完整执行且不可逆转的。


并发事务引发的问题

当多个事务同时操作同一批数据时,如果不加控制,会产生以下问题:

  • 脏读 (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(多版本并发控制)保证。
  • 一致性:由原子性、持久性、隔离性共同支撑,外加数据库逻辑约束。
今日访问 ... 次 | 今日访客 ... 人 | 本页阅读 ...
小站已萌萌哒运行了 0 0 0
已累计耕耘 33 篇博文 · 共 115.17k 个字
总访问量 ...
备案图标 豫公网安备41019702004633号