一、先搞懂:什么是事务?什么是 ACID?(基础)
在开始讲实现之前,先明确两个基础概念,避免新手懵圈:
1. 什么是 MySQL 事务?
简单说:事务就是“一组不可拆分的SQL操作”——这组操作要么全部执行成功,要么全部执行失败,不能只执行一部分。
举个例子:转账(从A账户转100元到B账户),需要执行两步SQL:① 扣A账户100元;② 加B账户100元。这两步必须同时成功(A扣钱、B加钱),或者同时失败(A不扣、B不加),这就是一个事务。
2. 什么是 ACID?
ACID 是事务的四大核心特性,是保证数据安全、准确的关键,先记住通俗定义(不用死记硬背专业话术):
- A(原子性):事务是一个“整体”,要么全成,要么全败,没有中间状态。比如转账,不可能出现“A扣了钱,B没加到钱”的情况。
- C(一致性):事务执行前后,数据的“规则”不能乱。比如转账前A有500元、B有300元,总金额800元;转账后A有400元、B有400元,总金额还是800元,这就是一致性;如果出现总金额变了,就是不一致。
- I(隔离性):多个事务同时执行时,互相不干扰。比如A和B同时给C转账,A转100、B转200,不能因为两个事务一起执行,导致C只收到200元(少了100元)。
- D(持久性):事务一旦提交,数据就永久存在,哪怕数据库宕机、断电,重启后数据也不会丢。比如转账成功后,就算电脑突然关机,重启后A的余额还是400元、B还是400元。
二、原子性(A):要么全成,要么全败,靠什么实现?
核心原理:数据库依靠 undo log(回滚日志) 实现,相当于给数据“拍快照”,出错了就回滚到快照状态。
举个例子:
你可以把 undo log 理解为“后悔药”——事务执行每一步SQL(比如修改数据)时,MySQL 不会直接覆盖原来的数据,而是先把“修改前的数据”记录到 undo log 里,再去修改实际数据。
转账案例:A账户500元,B账户300元,执行转账事务(扣A100、加B100):
- 事务开始,执行第一步:扣A账户100元(A从500→400);此时,MySQL 会在 undo log 里记录:“A账户,原来的金额是500元”。
- 执行第二步:加B账户100元(B从300→400);此时,MySQL 再在 undo log 里记录:“B账户,原来的金额是300元”。
- 如果这两步都成功,事务提交,undo log 会被标记为“可删除”(后续由MySQL自动清理)。
- 如果执行到第二步时出错(比如断电、SQL报错),事务需要回滚:MySQL 会读取 undo log 里的记录,把A的金额恢复成500元,把B的金额恢复成300元,相当于“这两步操作从没发生过”。
关键补充:


1033

被折叠的 条评论
为什么被折叠?



