MySQL 常用的事务和锁详解

1.1 事务介绍
在 MySQL 中,事务(Transaction) 是一组不可分割的 SQL 操作序列,这些操作要么全部成功执行,要么全部失败回滚,以此保证数据库操作的完整性和一致性。

事务将数据库从一种一致性状态转换为另一种一致性状态,保证系统始终处于一个完整且正确的状态;

1.1.1 事务执行流程
假设用户 A(账户余额 1000 元)要向用户 B(账户余额 2000 元)转账 500 元,这个过程需要执行两步操作:

从 A 的账户扣减 500 元(UPDATE account SET balance = balance – 500 WHERE id = ‘A’);
向 B 的账户增加 500 元(UPDATE account SET balance = balance + 500 WHERE id = ‘B’)。
这两步操作必须同时成功或同时失败,否则会导致数据不一致(比如 A 扣了钱但 B 没收到,或 A 没扣钱但 B 多了钱)。此时,事务就是保证这一点的核心机制。

1. 开启事务

BEGIN; — 或 START TRANSACTION,标记事务开始

2. 执行操作

— 第一步:A账户扣500元
UPDATE account SET balance = balance – 500 WHERE id = ‘A’;
— 第二步:B账户加500元
UPDATE account SET balance = balance + 500 WHERE id = ‘B’;

3. 提交事务(操作成功时)

如果两步更新都没有问题,执行COMMIT确认修改:

COMMIT;

此时,A 的余额变为 500 元,B 的余额变为 2500 元,修改永久生效(符合持久性)。

4. 回滚事务(操作失败时)

假设第一步执行成功(A 扣了 500 元),但第二步因网络故障或 SQL 错误未能执行(B 的余额未变),此时需执行ROLLBACK撤销所有操作:

ROLLBACK;

A 的余额会恢复到 1000 元,B 的余额仍为 2000 元

1.2.1 事务的特征(ACID)
事务必须满足以下四个基本特性,简称 ACID:

原子性(Atomicity)
事务中包含的所有操作(如插入、更新、删除等)是一个不可分割的整体,要么全部成功执行并提交,要么一旦发生错误就全部撤销(回滚),不会出现 “部分执行” 的中间状态

例如:

事务的 “原子性” 类似生活中 “要么全做,要么全不做” 的场景。例如:银行转账时,“A 账户扣除 100 元” 和 “B 账户增加 100 元” 这两个操作必须同时成功 —— 若 A 扣钱后 B 加钱失败,整个事务需回滚(A 的钱恢复,B 的钱不变),避免出现 “钱凭空消失” 的错误。
实现机制:

通过undolog(回滚日志) 实现。undolog 记录事务中每一步操作的 “逆运算”(例如,插入操作的逆是删除,更新操作的逆是恢复原值)。当事务需要回滚时,数据库会 “回放” 这些逆运算,将数据恢复到事务开始前的状态。
一致性(Consistency)
事务的执行必须使数据库从一个一致性状态转变为另一个一致性状态,且始终满足数据库的完整性约束(如主键唯一、外键关联、字段非空等)

例如:

若表中 “用户名” 字段设为唯一键,事务中修改用户名时,提交后必须保证新用户名不重复;若修改后出现重复,事务必须回滚,否则破坏一致性。

转账场景中,A 和 B 的总余额在事务前后必须相等(A 减少 100,B 增加 100,总余额不变),这就是一种一致性约束。

隔离性(Isolation)
当多个事务同时操作数据库时,每个事务的操作应与其他事务 “隔离”,互不干扰。隔离性通过定义不同的隔离级别,控制并发事务对同一数据的访问行为,解决脏读、不可重复读、幻读等问题

并发问题:

脏读:事务 A 读取到事务 B 未提交的修改(若 B 回滚,A 读取的数据是 “无效” 的)。
不可重复读:事务 A 多次读取同一数据时,事务 B 修改并提交了该数据,导致 A 两次读取结果不一致。
幻读:事务 A 按条件查询数据时,事务 B 插入了符合条件的新数据,导致 A 再次查询时多了 “不存在” 的记录。
隔离级别(MySQL 默认是 “可重复读”):

读未提交(Read Uncommitted):最低级别,允许读取未提交的事务数据,可能出现脏读、不可重复读、幻读。
读已提交(Read Committed):只能读取已提交的事务数据,避免脏读,但仍可能出现不可重复读、幻读。
可重复读(Repeatable Read):保证同一事务内多次读取数据结果一致,避免脏读、不可重复读,MySQL 通过 MVCC 避免幻读(大部分场景)。
串行化(Serializable):最高级别,事务串行执行(不并发),完全避免所有并发问题,但性能极低。
实现机制:

MVCC(多版本并发控制):通过为数据记录保存多个版本,实现 “非锁定读”。每个事务看到的数据版本由其开始时间决定,避免了读操作对写操作的阻塞,提升并发性能。
锁机制:处理并发写操作(如同时更新同一行)。MySQL 支持多种粒度的锁:
表锁:对整个表加锁(如 ALTER TABLE 操作),粒度大,并发低。
页锁:对数据页(B + 树的叶子节点)加锁,粒度中等。
行锁:对单行记录加锁(如 InnoDB 的行级锁),粒度小,并发高。
事务控制语句:

START TRANSACTION / BEGIN:显式开启事务。
COMMIT:提交事务,将所有修改持久化。
ROLLBACK:回滚事务,撤销所有未提交的修改。
SAVEPOINT <标识>:在事务中创建保存点(中间状态)。
ROLLBACK TO SAVEPOINT <标识>:回滚到指定保存点(而非事务开始),适用于部分回滚场景。
RELEASE SAVEPOINT <标识>:删除保存点。

 

欢迎使用66资源网
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
7. 本站有不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!

66源码网 » MySQL 常用的事务和锁详解

提供最优质的资源集合

立即查看 了解详情