💡转账不会出错的秘密武器,数据安全的守护神!
大家好呀!我是数据库小学妹👋
前几篇我们学会了各种查询和优化技巧,索引也让查询飞了起来。但在实践中我又遇到了新问题:
你给朋友转账100块,数据库会不会只执行一半?你账户扣了钱,对方账户的余额却没增加?
这个问题,靠普通SQL语句是解决不了的。
所以,数据库专门有事务——它就像“要么全干,要么不干”的保险箱。
一、从一个真实场景说起
假设你要从A账户转100元到B账户。在数据库里,这条转账操作要分两步:
UPDATE account SET money = money - 100 WHERE name = 'A';UPDATE account SET money = money + 100 WHERE name = 'B';
如果第一步执行完,数据库突然崩溃了(断电、网络中断),第二步没执行。结果就是:A少了100块,B没多——钱凭空蒸发了!
事务就是用来解决这个问题的。 它把这两个步骤打包成一个整体:要么两步都成功,要么两步都失败(回滚到转账前的状态)。
💡 事务就像网上购物下单——要么订单成功(扣库存+生成订单+扣款),要么订单失败(什么都不变),不会出现“库存扣了但订单没生成”的情况。
二、事务的四个特性(ACID)
数据库专家给事务总结了四个特性,首字母缩写就是ACID(酸)。记不住没关系,我帮你翻译成人话:
| 特性 | 英文 | 通俗解释 |
|---|---|---|
| 原子性 | Atomicity | 打包成一个整体,要么全做,要么全不做 |
| 一致性 | Consistency | 转账前后,总金额不变(A+B的钱总和固定) |
| 隔离性 | Isolation | 你转你的钱,我转我的钱,互不干扰 |
| 持久性 | Durability | 一旦转账成功,就算断电也不会丢 |
💡 新手只需要先记住原子性(打包)和持久性(不丢),隔离性后面再深入。
三、事务怎么用?BEGIN、COMMIT、ROLLBACK
在MySQL里,事务的默认行为是:每一条SQL语句自动提交(autocommit=1)。也就是说,你写个UPDATE,它直接就执行了,没法撤回。
要手动控制事务,需要先关闭自动提交,或者用命令显式开始。
基本语法
-- 开始一个事务
START TRANSACTION; -- 或者 BEGIN;
-- 执行一堆SQL
UPDATE account SET money = money - 100 WHERE name = 'A';
UPDATE account SET money = money + 100 WHERE name = 'B';
-- 如果一切顺利,提交事务(真正生效)
COMMIT;
-- 如果出错了,回滚事务(撤销所有操作)
ROLLBACK;
实战演示
START TRANSACTION;
UPDATE account SET money = money - 100 WHERE name = 'A';
-- 假设这里发现A余额不足,报错了
ROLLBACK; -- 撤销上面的UPDATE,A的钱没变
记住: COMMIT 之后,数据就真的改了,ROLLBACK 也救不回来了。所以提交前一定确认好!
四、事务的隔离级别(简要了解)
当多个事务同时操作同一行数据时,会互相干扰。比如你正在转账,别人也在查你的余额。数据库提供了几种隔离级别来控制这种干扰。
💡 新手阶段,知道MySQL默认是可重复读就够了。等遇到“同一个事务里查两次结果不一样”的怪现象时,再回来研究隔离级别。
五、什么时候必须用事务?
✅ 必须使用事务的场景

❌ 可以不用事务的场景

六、新手避坑指南(血泪总结)

七、今日学习心得
今天的内容总结成三句话:
- 事务就是把多个操作打包,要么全成功,要么全失败
- 用
START TRANSACTION 开始,COMMIT 提交,ROLLBACK 回滚 - MySQL默认隔离级别是可重复读,新手先用默认的就好
👋 我是数据库小学妹,一个从设计转行数据库的菜鸟。
本文为个人学习总结,所有命令均在MySQL 8.0环境下验证。事务是保证数据一致性的核心,写多表操作时记得加上。