什么是事务四大特性?用业务案例通俗讲透 ACID 什么是事务四大特性用业务案例通俗讲透 ACID“转账一半系统崩了怎么办”“两个订单同时抢最后一件库存超卖谁背锅”“查账单的时候钱还在不在”这些问题本质上都在问一件事数据库的事务靠不靠谱而判断一个事务靠不靠谱业界有一套黄金标准——ACID。这四个字母撑起了整个关系型数据库的信任基石。今天不讲枯燥定义我们用电商下单、转账、支付这些你每天都在写的业务场景把 ACID 讲透。先给一句话人话版定义特性英文一句话解释原子性Atomicity要么全做要么全不做​一致性Consistency数据从一个合法状态变到另一个合法状态​隔离性Isolation多个事务互不干扰像排队一样​持久性Durability提交成功落地生根断电也不丢​接下来一个个拆解。一、原子性Atomicity要么都成功要么都失败业务场景转账A 给 B 转账 100 元。底层至少两步操作1. A 账户扣 100 元 2. B 账户加 100 元如果第 1 步成功第 2 步失败比如服务宕机、网络抖动会发生什么A 少了 100B 没收到钱钱“人间蒸发”了 这显然不能接受。原子性如何兜底数据库保证这两步属于同一个事务。START TRANSACTION; UPDATE account SET balance balance - 100 WHERE id A; UPDATE account SET balance balance 100 WHERE id B; COMMIT;两条 SQL要么一起成功只要有一条失败数据库自动执行ROLLBACK回滚最终结果钱既没少也没多系统回到转账前的状态✅ 原子性 “同生共死”就像火箭发射要么整体升空要么原地不动绝不允许“半空解体”。二、一致性Consistency数据永远“说得通”业务场景下单扣库存用户下单买一件商品库存从 10 变成 9。这里有几个“业务规则”约束库存不能为负数订单金额必须等于商品单价 × 数量已支付订单必须有对应的支付记录什么是一致性事务执行前后数据库都必须满足所有业务规则和约束。START TRANSACTION; -- 扣库存 UPDATE product SET stock stock - 1 WHERE id 1001; -- 创建订单 INSERT INTO orders(...) VALUES(...); COMMIT;如果库存不足数据库会直接报错如 CHECK / 外键 / 应用层校验事务回滚库存还是 10订单也不会生成不会出现“库存 -1订单却不存在”的脏数据✅ 一致性 “数据始终讲道理”⚠️ 注意一个常见误区一致性不是数据库自动保证的业务逻辑而是原子性 隔离性 持久性再加上你写的正确的业务代码共同维护的结果。换句话说ACID 里A、I、D 是数据库的能力C 是你和数据库一起守住的底线三、隔离性Isolation并发不乱各走各的业务场景秒杀抢最后一件商品商品只剩 1 件同时来了两个请求用户 A下单用户 B下单如果没有隔离性可能出现这种情况A 查库存 1 B 查库存 1 A 扣库存 → 0 B 扣库存 → -1 ❌超卖这就是典型的并发问题。隔离性做了什么数据库通过锁 / MVCC多版本并发控制让多个事务互相隔离。以InnoDB 默认的 REPEATABLE READ​ 为例A 的事务开启后看到库存 1B 的事务也被正确隔离其中一个事务提交后另一个再操作时会被阻塞或失败最终只有一个订单成功库存从 1 → 0✅ 隔离性 “你在操作的时候别人看不到中间状态”可以把它想象成每个人进了一个“小黑屋”操作数据关上门干活干完才开门让别人进来。当然隔离级别越高并发性能越低这是经典的CAP 权衡​ 在事务里的体现。四、持久性Durability落盘才是真安全业务场景支付成功用户完成支付页面提示“支付成功”。这时候如果数据库服务器突然断电数据会丢吗如果符合持久性不会丢。数据库是怎么做到的事务提交时不只是改内存还会把修改记录写入redo log重做日志redo log 是顺序写磁盘速度很快即使断电重启后数据库也会根据 redo log恢复已提交的数据COMMIT → 写 redo log → 返回客户端成功所以哪怕 MySQL 进程崩溃、服务器掉电✅ 已经COMMIT的数据一定存在⚠️ 注意持久性 ≠ 立刻刷盘到数据页而是提交成功 数据库承诺我能恢复✅ 持久性 “说了算不算赖账”四兄弟的关系谁也离不开谁很多人以为 ACID 是四个独立特性其实它们是一个整体原子性保证操作不残缺一致性是最终目标数据正确隔离性防止并发破坏一致性持久性保证结果不丢失可以用一句话串起来在一个支持隔离性的环境中通过原子性和持久性最终达成数据的一致性。举个完整例子下单全流程START TRANSACTION; -- 1. 扣库存 UPDATE product SET stock stock - 1 WHERE id 1001 AND stock 0; -- 2. 创建订单 INSERT INTO orders(order_no, user_id, amount) VALUES (ON123, 1, 100); -- 3. 扣账户余额 UPDATE account SET balance balance - 100 WHERE id 1 AND balance 100; COMMIT;在这个事务里原子性任意一步失败全部回滚一致性库存、订单、余额始终保持业务合法隔离性并发下单不会互相覆盖库存持久性COMMIT 成功后哪怕宕机订单也真实存在常见误区澄清面试常问1️⃣ 隔离性 串行化❌ 不是。串行化是最高隔离级别InnoDB 常用的是REPEATABLE READ通过 MVCC 实现高性能并发2️⃣ 一致性是谁保证的✅ 数据库保证约束唯一、外键、NOT NULL✅ 开发人员保证业务逻辑正确✅ 原子性 / 隔离性 / 持久性是基础3️⃣ Spring 的Transactional能保证 ACID 吗能保证原子性、隔离性、持久性一致性​ 仍然依赖你写的业务代码比如你忘了校验余额数据库也没约束那一致性照样崩

相关新闻

最新新闻

从统计单词数看字符串处理:核心算法、边界处理与实战应用

从统计单词数看字符串处理:核心算法、边界处理与实战应用

1. 项目概述:从一道经典题目看字符串处理的实战“统计单词数”,这个标题听起来简单直接,但背后涉及的却是编程入门乃至算法竞赛中一个非常经典且实用的场景。我第一次接触这道题,还是在很多年前准备NOIP(全国青少年信息…

2026/7/29 4:42:56
MyBatis动态SQL安全实践:${}与#{}的深度解析与SQL注入防御

MyBatis动态SQL安全实践:${}与#{}的深度解析与SQL注入防御

1. 项目概述:从一道课后习题到企业级安全实践最近在辅导团队新人学习Java EE,特别是MyBatis框架时,总会遇到第三章关于动态SQL的课后习题。这些习题看似基础,但往往藏着许多新手乃至有一定经验的开发者都容易忽略的“坑”。尤其是…

2026/7/29 4:42:56
Windows DNS缓存查看与管理:原理、命令与实战排查指南

Windows DNS缓存查看与管理:原理、命令与实战排查指南

1. 项目概述:为什么需要查看Windows DNS缓存?当你访问一个网站,比如www.example.com,你的电脑并不会直接知道这个域名对应哪台服务器。它需要先问路,这个“问路”的过程就是域名解析,而负责指路的“交通警察…

2026/7/29 4:42:56
C++/QT实现与MATLAB一致的短时傅里叶变换(STFT)时频分析

C++/QT实现与MATLAB一致的短时傅里叶变换(STFT)时频分析

1. 项目概述与核心价值最近在做一个音频信号分析相关的项目,需要把一段时域信号转换成时频图来观察频率成分随时间的变化。这个需求在语音识别、故障诊断、音乐分析里太常见了,业内标准工具就是短时傅里叶变换。项目初期为了快速验证算法,我直…

2026/7/29 4:42:56
VMware Horizon 8.0入门④--AD域服务器部署

VMware Horizon 8.0入门④--AD域服务器部署

编辑AD域控制器的配置 注意:为了提升性能,请在部署完毕后再更改配置 关闭虚拟机,点击编辑设置 设置2个CPU和1G内存,点击确定 准备环境 开启远程桌面 弹出光盘 检查防火墙是否关闭 在导航栏输入wf.msc 点击属性关闭域、专用和公用配置文件 设置主机名 右键此电脑->更…

2026/7/29 4:42:56
Android无线ADB调试实战:WiFi与蓝牙方案详解与避坑指南

Android无线ADB调试实战:WiFi与蓝牙方案详解与避坑指南

1. 项目概述:告别数据线,拥抱无线调试新体验作为一名在移动开发一线摸爬滚打了十多年的老码农,我几乎每天都要和ADB(Android Debug Bridge)打交道。从早期的Eclipse到现在的Android Studio,一根USB数据线就…

2026/7/29 4:37:56

月新闻