了解数据库前必须要搞懂的事情:MySQL 事务四大特性 ACID 是怎么实现的?

一、先搞懂:什么是事务?什么是 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):

  1. 事务开始,执行第一步:扣A账户100元(A从500→400);此时,MySQL 会在 undo log 里记录:“A账户,原来的金额是500元”。
  2. 执行第二步:加B账户100元(B从300→400);此时,MySQL 再在 undo log 里记录:“B账户,原来的金额是300元”。
  3. 如果这两步都成功,事务提交,undo log 会被标记为“可删除”(后续由MySQL自动清理)。
  4. 如果执行到第二步时出错(比如断电、SQL报错),事务需要回滚:MySQL 会读取 undo log 里的记录,把A的金额恢复成500元,把B的金额恢复成300元,相当于“这两步操作从没发生过”。

关键补充:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值