事务:让数据操作"要么全成功,要么全失败"!|转行学DB第10天

简介: 数据库小学妹带你轻松掌握事务!转账不丢钱、数据不混乱的秘密,就在ACID四大特性——原子性(全做或全不做)、一致性、隔离性、持久性。用START TRANSACTION开启,COMMIT提交,ROLLBACK回滚,保障多步操作安全可靠。

💡转账不会出错的秘密武器,数据安全的守护神!

大家好呀!我是​数据库小学妹​👋

前几篇我们学会了各种查询和优化技巧,索引也让查询飞了起来。但在实践中我又遇到了新问题:

你给朋友转账100块,数据库会不会只执行一半?你账户扣了钱,对方账户的余额却没增加?

这个问题,靠普通SQL语句是解决不了的。

所以,数据库专门有​事务​——它就像“要么全干,要么不干”的保险箱。

一、从一个真实场景说起

假设你要从A账户转100元到B账户。在数据库里,这条转账操作要分两步:

  1. UPDATE account SET money = money - 100 WHERE name = 'A';
  2. 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 也救不回来了。所以提交前一定确认好!

四、事务的隔离级别(简要了解)

当多个事务同时操作同一行数据时,会互相干扰。比如你正在转账,别人也在查你的余额。数据库提供了几种隔离级别来控制这种干扰。
1.png

💡 新手阶段,知道MySQL默认是可重复读就够了。等遇到“同一个事务里查两次结果不一样”的怪现象时,再回来研究隔离级别。

五、什么时候必须用事务?

✅ 必须使用事务的场景

2.png

❌ 可以不用事务的场景

3.png

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

4.png

七、今日学习心得

今天的内容总结成三句话:

  1. 事务就是把多个操作打包​,要么全成功,要么全失败
  2. 用 ​START TRANSACTION​ 开始,COMMIT​ 提交,ROLLBACK​ 回滚
  3. MySQL默认隔离级别是​​可重复读​,新手先用默认的就好

👋 我是​数据库小学妹​,一个从设计转行数据库的菜鸟。

本文为个人学习总结,所有命令均在MySQL​ 8.0环境下验证。事务是保证数据一致性的核心,写多表操作时记得加上。

相关文章
|
4月前
|
SQL 关系型数据库 MySQL
数据量大查询慢?索引让你的SQL秒级响应!|转行学DB第9天
用生活化比喻(如字典目录)详解索引原理:它通过B+树结构加速查询,避免全表扫描;涵盖创建、查看、删除索引方法,联合索引的最左前缀原则,以及读写平衡等实战要点——让查询从“等几秒”变“秒出”!
数据量大查询慢?索引让你的SQL秒级响应!|转行学DB第9天
|
4月前
|
SQL 关系型数据库 MySQL
子查询:让SQL像俄罗斯套娃一样嵌套!|转行学DB第8天
数据库小学妹带你轻松入门子查询!用“SELECT里套SELECT”,像俄罗斯套娃一样,一步解决“先算平均分、再查高分学生”等两步难题。支持WHERE(条件筛选)、FROM(临时表)、SELECT(标量列)三种用法,简洁直观,新手友好~
|
2月前
|
SQL 关系型数据库 MySQL
SQL代码审查指南:命名规范+10大反模式+四维检查清单,一篇全搞定
数据库小学妹带你攻克SQL规范难题!从命名、格式到10大反模式(如SELECT*、隐式转换、ORDER BY RAND等),结合真实踩坑案例,详解可读、可维护、高性能的SQL写法,并提供SQL Review四维审查清单与团队落地方法,助你写出工业级质量SQL。
|
4月前
|
SQL 数据库
多表关联查询入门:LEFT JOIN、INNER JOIN一文搞懂|转行学DB第6天
本文通俗易懂地讲解了数据库多表查询的三种JOIN操作:INNER JOIN(内连接)只返回两表匹配的数据,适用于查询交集数据;LEFT JOIN(左连接)保留左表所有记录并匹配右表数据,适用于查询主表完整信息;RIGHT JOIN(右连接)则保留右表所有记录。
|
4月前
|
SQL 关系型数据库 MySQL
主键、外键和约束:让数据库“有规矩”才能不出错!|转行学DB第5天
本文用通俗易懂的语言讲解了主键(数据的唯一标识)、外键(表间关联)以及唯一约束、非空约束等其他常见约束规则。通过具体SQL示例展示了各种约束的使用方法,并分享了新手容易踩的坑和实用建议。
|
10月前
|
人工智能 Java Nacos
基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南
本文将针对 Spring AI Alibaba + Nacos 的分布式多智能体构建方案展开介绍,同时结合 Demo 说明快速开发方法与实际效果。
5516 112
|
人工智能 运维 关系型数据库
智能运维+多模型服务能力,阿里云 RDS AI 助手旗舰版正式上线!
RDS AI 助手旗舰版在 RDS AI 助手专业版智能运维能力的基础上,提供灵活模型选择、智能模型路由、多模型灾备、API Key 集成等更自主可控、灵活便捷的模型服务,并支持纳管运维各类环境部署的数据库。
智能运维+多模型服务能力,阿里云 RDS AI 助手旗舰版正式上线!
|
4月前
|
人工智能 监控 Kubernetes
LoongCollector + ACS Agent Sandbox:构建 AI Agent 生产级运行平台
文章介绍了阿里云ACSAgentSandbox与LoongCollector协同构建的AIAgent生产级运行平台,通过沙箱隔离保障运行时安全,并以高性能、全链路可观测能力解决Agent行为不可预测和执行风险难题。
2012 72
|
4月前
|
弹性计算 中间件 定位技术
稳赢大促!货拉拉携手阿里云第九代Intel实例实现业务新跨越
升级后,货拉拉成功稳定支撑了“第九届金秋拉货节”等大促场景,单日完单量创历史新高。
稳赢大促!货拉拉携手阿里云第九代Intel实例实现业务新跨越