MySQL笔记-第3篇:一篇搞懂事务、ACID和隔离级别
一、事务是什么?
简单来说,事务就是把完成同一目标的多个SQL操作打包成一个整体,举个例子:你给朋友转账100块。
对于熟悉SQL的我们来说,这个需求很快就可以完成。
1 | UPDATE account SET money = money - 100 WHERE id = 1; -- 你扣钱 |
在实际的SQL运行环境中,如果第一个UPDATE执行完了,第二个还没执行,系统崩了,结果你的钱扣了,但朋友没收到。为了解决这一问题,我们提出的事务的概念。
简单来说,事务就是把完成同一目标的多个SQL操作打包成一个整体。在这个场景中,就是把转钱这一目标打包成一个整体,这两个操作要么都成功,要么都失败,不允许中间状态。 这样就不会出现钱丢了的故障。
二、怎么用?

1 | START TRANSACTION; -- 开启事务 |
简单来说,只要用三个命令就可以控制事务:
| 命令 | 作用 |
|---|---|
START TRANSACTION |
开启事务 ,执行SQL语句 |
COMMIT |
提交结果,让所有修改生效 |
ROLLBACK |
回滚事务,撤销所有修改 |
当事务执行过程中,系统没有发生故障,最后只需要提交运行结果,但如果系统出现故障,需要对事务进行回滚,防止错误的结果上传数据库,导致错误。
三、事务的四个特性(ACID)
| 特性 | 人话 |
|---|---|
| 原子性 | 要么全成功,要么全失败 |
| 一致性 | 钱不会凭空消失或出现 |
| 隔离性 | 你转账不会影响别人转账 |
| 持久性 | 转完了,钱就在那儿了 |
知道这四个词就行,目的是体现事务在完成一个目标的稳定性和独立性。实际写代码时,我们只需要记住:开启 → 执行 → 提交/回滚的流程。
四、一个必踩的坑
由于MySQL默认开启了自动提交即每执行一条SQL,就自动帮你COMMIT。
1 | UPDATE account SET money = money - 100 WHERE id = 1; |
如果你想多条SQL作为一个事务,必须手动START TRANSACTION。
1 | START TRANSACTION; |
在实际的工作中最好使用手动提交,避免错误数据上传数据库。
五、隔离级别
事务之间会互相影响,会造成一些不可避免的问题
为了解决这些问题,我们提出了事务的四个隔离等级。
| 隔离级别 | 能解决 | 仍有问题 | 性能 |
|---|---|---|---|
| 读未提交 | 无 | 脏读、不可重复读、幻读 | 最好 |
| 读已提交 | 脏读 | 不可重复读、幻读 | 较好 |
| 可重复读(MySQL默认) | 脏读、不可重复读 | 幻读 | 一般 |
| 串行化 | 全部 | 无 | 最差 |
从表格可以明显看到,隔离等级越高,性能越差,对整个数据库的管理效率越低,所以一句话建议:MySQL默认的“可重复读”就够了,别乱改。
六、最后的话
关于数据库的事务的知识总结完毕,如果对你有帮助的话,可以一键三连!!!最后感谢你的查阅!!!
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 七夏的树洞🐿️!








