惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Hacker News: Ask HN
Hacker News: Ask HN
N
News and Events Feed by Topic
Forbes - Security
Forbes - Security
The Last Watchdog
The Last Watchdog
TaoSecurity Blog
TaoSecurity Blog
Schneier on Security
Schneier on Security
SecWiki News
SecWiki News
V
Vulnerabilities – Threatpost
Project Zero
Project Zero
O
OpenAI News
W
WeLiveSecurity
Security Archives - TechRepublic
Security Archives - TechRepublic
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
H
Hacker News: Front Page
Cisco Talos Blog
Cisco Talos Blog
Spread Privacy
Spread Privacy
Help Net Security
Help Net Security
P
Privacy & Cybersecurity Law Blog
K
Kaspersky official blog
S
Security @ Cisco Blogs
Latest news
Latest news
AWS News Blog
AWS News Blog
U
Unit 42
Martin Fowler
Martin Fowler
阮一峰的网络日志
阮一峰的网络日志
S
Secure Thoughts
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Know Your Adversary
Know Your Adversary
Scott Helme
Scott Helme
博客园 - 司徒正美
B
Blog RSS Feed
C
Check Point Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
D
Docker
Google Online Security Blog
Google Online Security Blog
Jina AI
Jina AI
aimingoo的专栏
aimingoo的专栏
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Last Week in AI
Last Week in AI
月光博客
月光博客
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
SegmentFault 最新的问题
NISL@THU
NISL@THU
T
The Blog of Author Tim Ferriss
C
Cisco Blogs
Attack and Defense Labs
Attack and Defense Labs
小众软件
小众软件

博客园 - lzhdim

JavaScript 中的原型与继承 1分钟查清局域网所有IP 20260714 - 个人小作品更新 WorkBuddy 完整教程手册 专为AI而生的企业级QLC SSD!长江存储PE501 61.44TB评测:超过1PB的写入测试 32GB显存才是第一生产力!英特尔锐炫 Pro B70评测:中小企业AI降本神器 JavaScript中的this关键字 C#开发的PopoSaver泡泡屏保应用 - 开源研究系列文章 - 个人小作品 6天不间断测试告诉你到底有多省电!米家空调巨省电大1.5匹评测:制冷峰值功率不超过500W 三倍双摄加持 + D-Log 2 曲线!大疆DJI OSMO Pocket 4P全面评测:补齐短板,化身口袋电影机 晶栈4.0闪存立威!长江存储致态TiPro9000 2TB SSD评测:缓外写入超4GB/s独一档 C# 多线程同步机制详解:原理、使用与性能对比 JavaScript作用域与闭包讲解 最受欢迎的 10 大免费 AI 工具 六种AI生意,从月入一万到月入十万 5个国产大模型实测对比2026:DeepSeek、Kimi、豆包、通义、智谱哪个好用 豆包、元宝、千问、Kimi、DeepSeek,这么多AI软件,到底该用哪个? 微软免费开源了一个 Linux 操作系统,没错!是微软出品 一次看懂5种咖啡冲煮方式:意式、手冲、法压、冷萃、摩卡壶到底有什么区别 120个 实用CSS 技巧汇总合集 JavaScript运算符与表达式详解 C#开发的ScreenSaver屏保应用 - 开源研究系列文章 - 个人小作品 WinForm 中跨线程操作 UI 的解决方案 JavaScript变量与数据类型详解 苹果良心!iOS 27适配设备公布:30款机型 7年前的iPhone 11还能升级 C++图形用户界面开发入门 10个不该免费的GitHub神级项目 JavaScript语言全面概述:从历史到现代实践 一张图看懂常见咖啡 C盘空间多出来4GB:谷歌服软 Chrome本地AI大模型可禁用、删除了 96GB显存运行230B大模型!七彩虹灵创K16笔记本评测:160W性能释放 AMD锐龙AI Max+ 395加持全能移动AI工作站 AI PC最强存储搭档!雷克沙NM1090 PRO 8TB固态评测:14400MB/s满速不缩水 C#已经不是当年的C#了——我用它写了个微秒级数据库引擎 EasyTool:轻量全能的 .NET 工具类库 SQL 入门 17:MySQL 数据类型:从字符串到 JSON 的全面解析 SQL 入门 16:SQL 事务隔离级别与死锁解析(易懂) 原相3955XM+TL3228主控!小米电竞鼠标2全面评测:原生双8K究竟有多强 PCIe 4.0火力全开:闪迪奥丁马仕GX 7100 NVMe SSD上手 超乎预料的千元级电竞主板!七彩虹iGame B850M Ultra-OC V14主板评测 名人 - 我的闪存 C#性能优化技巧 SQL 入门 14:SQL 触发器与事件:自动化数据处理 38个实用的JavaScript 技巧 一款基于 .Net WinForm 开发的节点编辑器,纯 GDI 实现,体积仅 100+Kb Masuit.Tools:这个 C# 工具库 SQL 入门 13:SQL 存储过程与函数:封装逻辑与参数处理 49个 JavaScript 代码快捷技巧,让你在 2026 年成为代码高手 20260503 - 个人小作品更新 SQL 入门 12:SQL 视图:创建、修改与可更新视图 C#如何实现Windows系统桌面截图功能... 6999元AMD新旗舰首测!锐龙9 9950X3D2性能解禁:这颗U根本不是给游戏玩家造的 SQL 入门 11:日期时间格式化、IF、CASE的使用 基于C#的校时类库的实现及使用 - 开源项目研究文章 39g无打孔+原生双8K!雷柏VT0 Air MAX / VT3s Air MAX鼠标评测:轻到飞起还快到极致 WinForm 中控件自适应窗体变化 20260413 - 个人小作品更新 SQL 入门 10:SQL 内置函数:数值、字符串与时间处理 最强麒麟芯+自研风冷 华为Mate80 Pro MAX 风驰版全面评测:涡轮散热封神 性能稳到骨子里 WiFi8核心技术特性与性能分析 2026年最新AMD/Intel桌面CPU排名:多线程、单线程、游戏性能谁才是第一 用DG对C盘进行扩容 - 初学者系列 - 学习者系列 还有比它更强的OEM固态吗!长江存储PC550 1TB评测:不用散热片也能满速的PCIe 5.0 SSD SharpCompress:跨平台的 C# 压缩与解压库 SQL 入门 9:SQL 高级子查询:ANY、EXISTS 与多位置应用 盘点接私活20个最实用的 .NET 开源项目 C#中加载图片的资源释放 20260404 - 个人小作品更新 开启iphone的墙纸玻璃效果 可能是综合性能最强的PCIe 5.0 SSD!铠侠EXCERIA PRO G2 2TB评测:AIDA64线性写入全程不掉速 SQL 入门 8:SQL 复杂查询:子查询与ALL关键词 性能最强的锐龙AI 9 H 465轻薄本!华硕无畏Pro16锐龙版2026评测 4盘RAID 0读写超1100MB/s!希捷酷狼Pro 32TB硬盘评测:百万文件快速完成备份 项目(Project)、项目集(Program)、项目组合(Portfolio) SQL 入门 7:SQL 聚合与分组:函数、GROUP BY 与 ROLLUP
SQL 入门 15:SQL 事务:从 ACID 到四种常见的并发问题
lzhdim · 2026-05-21 · via 博客园 - lzhdim

事务是数据库操作的核心机制,确保一组 SQL 语句作为一个整体执行,要么全部成功,要么全部撤销。本文基于 sql_store 数据库,结合 ATM 转账场景,深入讲解事务的 ACID 特性、创建方法及并发控制中的常见问题,帮助读者理解如何保证数据一致性和稳定性。

学习内容

1. 事务概述

事务是一组 SQL 语句的集合,旨在完成特定任务,具有不可分割性。事务的四大特性(ACID)确保数据操作的可靠性:

  • 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不执行,不会出现部分执行的状态。
  • 一致性(Consistency):事务执行前后,数据库从一个一致状态转换到另一个一致状态,满足所有约束。
  • 隔离性(Isolation):并发执行的多个事务互不干扰,确保每个事务独立运行。
  • 持久性(Durability):事务一旦提交,其结果永久保存,即使系统故障也不会丢失。

以 ATM 转账为例:从一个账户扣除 100 元并向另一个账户增加 100 元,这两个操作必须同时成功或同时失败,否则可能导致资金丢失或数据不一致。

2. 创建事务

事务通过 START TRANSACTION 开始,COMMIT 提交确认,ROLLBACK 撤销操作。自动生成的 ID 可通过 LAST_INSERT_ID() 获取,该函数返回当前会话最近一次插入操作的自动递增 ID,适用于跨表关联。

3. 并发与锁定

并发事务运行时,MySQL 使用行级锁保护数据。默认隔离级别为 REPEATABLE READ,写操作(如 UPDATE)会对目标行加排他锁(X 锁),阻止其他事务修改相同行。未释放锁的查询会被阻塞,默认超时时间为 50 秒(由 innodb_lock_wait_timeout 参数控制),超时后报错。

4. 并发常见问题

并发执行可能引发以下问题:

  • 丢失更新:两个事务同时修改同一数据,后提交的事务覆盖前者的修改,导致前者更新丢失。
  • 脏读:一个事务读取到另一个未提交事务的修改,若后者回滚,前者读取的数据无效。常见于 READ UNCOMMITTED 隔离级别。
  • 不可重复读:同一事务内两次查询同一数据,结果不同,因其他事务修改了数据。
  • 幻读:同一事务内两次查询同一范围,结果行数变化,因其他事务插入或删除行。

事务隔离机制(如 REPEATABLE READ)通过锁和版本控制有效缓解这些问题。

示例代码与讲解

1. 创建事务

START TRANSACTION;
INSERT INTO orders (customer_id, order_date, status)
VALUES (1, '2019-01-01', 1);
INSERT INTO order_items
VALUES (LAST_INSERT_ID(), 1, 1, 1);
COMMIT;

此代码开启一个事务,插入一条订单记录及其关联的订单项。LAST_INSERT_ID() 获取刚插入的订单 ID,确保订单与订单项正确关联。COMMIT 提交后,数据正式写入数据库。若单独执行 INSERT 语句而不提交,操作不会生效,体现事务的原子性。

2. 并发与锁定

START TRANSACTION;
UPDATE customers
SET points = points + 10
WHERE customer_id = 1;
COMMIT;

此事务为客户 ID 为 1 的记录增加 10 积分。执行期间,MySQL 对该行加排他锁,阻止其他事务修改。若另一会话尝试更新同一行,会被阻塞,直至锁释放。默认超时 50 秒后,若仍未获得锁,将报错:ERROR 1205: Lock wait timeout exceeded。这是 REPEATABLE READ 隔离级别确保一致性的体现。

3. 并发问题场景

  • 丢失更新
    假设账户余额为 1000 元:
    • 事务 A 读取余额 1000,计算取款 200 后为 800,尚未提交。
    • 事务 B 读取余额 1000,计算存款 500 后为 1500,并提交。
    • 事务 A 提交 800,覆盖事务 B 的 1500,导致 500 元丢失。
      MySQL 的锁机制通常能避免此类问题。
  • 脏读
    事务 A 扣款 100 元但未提交,事务 B 读取到减少后的余额。事务 A 回滚后,事务 B 读取的数据无效。READ UNCOMMITTED 隔离级别可能引发此问题。
  • 不可重复读
    事务 A 两次查询余额,中间事务 B 修改余额,导致两次结果不一致。REPEATABLE READ 通过锁机制防止此问题。
  • 幻读
    事务 A 两次查询某范围订单,第一次返回 10 条,第二次返回 11 条,因事务 B 插入新订单。幻读涉及行增删,较不可重复读更复杂。

总结

事务通过 ACID 特性确保数据库操作的可靠性和一致性。ATM 转账场景生动说明了事务的必要性:扣款与存款必须同步完成。并发控制通过锁和隔离级别有效管理丢失更新、脏读、不可重复读和幻读等问题。本文基于 sql_store 数据库,结合代码示例解析事务的核心概念。后续内容将探讨索引设计或查询优化,敬请关注。