事务与并发控制:当多人同时操作数据库

发布时间:2026/7/9 2:49:34

事务与并发控制:当多人同时操作数据库
事务与并发控制当多人同时操作数据库一句话总结事务通过 ACID 特性保证操作的完整性并发控制通过锁机制和多版本并发控制MVCC协调多个事务同时执行防止丢失修改、读脏数据、不可重复读和幻读四大问题。一、从一个生活场景说起想象你和同事同时操作公司的财务数据库你从 A 账户转 1000 元到 B 账户同事同时查询 A 账户的余额用于报表如果没有事务和并发控制会发生什么你的转账做了一半A 已扣款B 还没加款系统崩溃了——钱去哪了同事读到了你扣款后、加款前的中间状态——报表数据是错的两人同时修改同一条记录——一个人的修改被另一个人覆盖这些问题正是事务与并发控制要解决的核心。二、事务要么全做要么全不做2.1 什么是事务事务Transaction是用户定义的一个数据库操作序列这些操作要么全部执行要么全部不执行是一个不可分割的工作单位。2.2 事务的 ACID 特性特性英文含义类比原子性Atomicity事务中的操作要么全部成功要么全部回滚转账扣款和加款必须同时完成一致性Consistency事务执行前后数据库从一个一致状态变到另一个一致状态转账前后总金额不变隔离性Isolation多个事务并发执行时互不干扰你转账同事查账互不干扰持久性Durability事务一旦提交结果永久保存转账成功后即使断电钱也不会变回来2.3 SQL 中的事务控制-- 开始事务BEGINTRANSACTION;-- 或 START TRANSACTION;-- 执行操作UPDATE账户SET余额余额-1000WHERE账户号A;UPDATE账户SET余额余额1000WHERE账户号B;-- 提交事务永久保存COMMIT;-- 或者回滚事务撤销所有操作-- ROLLBACK;2.4 事务的状态BEGIN │ ▼ ┌───────────────┐ │ 活动状态 │ ← 正在执行操作 └───────┬───────┘ │ ┌───────┴───────┐ ▼ ▼ ┌─────────┐ ┌─────────┐ │ 部分提交 │ │ 失败状态 │ │ (COMMIT)│ │ (ROLLBACK) └────┬────┘ └────┬────┘ │ │ ▼ ▼ ┌─────────┐ ┌─────────┐ │ 提交状态 │ │ 中止状态 │ │ (持久化)│ │ (回滚完成) └─────────┘ └─────────┘三、并发操作带来的四大问题当多个事务同时操作数据库时如果不加控制会出现以下问题3.1 丢失修改Lost Update两个事务同时读取同一数据然后都修改后提交的事务覆盖了先提交的事务。时间事务 A事务 BT1读取余额 1000T2读取余额 1000T3余额 1000 100 1100T4余额 1000 200 1200T5提交T6提交覆盖了 A 的修改结果A 的 100 操作丢失了最终余额是 1200 而非 1300。3.2 读脏数据Dirty Read一个事务读取了另一个事务尚未提交的数据而那个事务后来回滚了。时间事务 A事务 BT1修改余额为 1200未提交T2读取余额 1200脏数据T3回滚余额恢复为 1000T4基于 1200 做决策错误3.3 不可重复读Non-repeatable Read同一事务内两次读取同一数据结果不一样因为另一个事务在两次读取之间修改并提交了。时间事务 A事务 BT1读取余额 1000T2修改余额 800提交T3再次读取余额 800变了不可重复读强调同一事务内两次读取结果不一致。3.4 幻读Phantom Read同一事务内两次查询条件相同的数据集合但第二次出现了新的行另一个事务插入并提交。时间事务 A事务 BT1SELECT COUNT(*) FROM 学生 WHERE 系‘计算机’ → 100T2INSERT 一名计算机系学生提交T3再次执行相同查询 → 101幻行出现幻读和不可重复读的区别不可重复读是某行的值变了幻读是行数变了。四、事务隔离级别在并发与性能之间权衡SQL 标准定义了四种隔离级别级别越高并发问题越少但性能越低。隔离级别丢失修改脏读不可重复读幻读实现复杂度READ UNCOMMITTED❌✅✅✅低READ COMMITTED❌❌✅✅中REPEATABLE READ❌❌❌✅高SERIALIZABLE❌❌❌❌最高❌ 不会发生✅ 可能发生4.1 设置隔离级别-- MySQLSETSESSIONTRANSACTIONISOLATIONLEVELREADCOMMITTED;SETSESSIONTRANSACTIONISOLATIONLEVELREPEATABLEREAD;SETSESSIONTRANSACTIONISOLATIONLEVELSERIALIZABLE;-- PostgreSQLSETTRANSACTIONISOLATIONLEVELSERIALIZABLE;-- SQL ServerSETTRANSACTIONISOLATIONLEVELREADCOMMITTED;4.2 各数据库默认隔离级别数据库默认隔离级别说明MySQL (InnoDB)REPEATABLE READ默认解决不可重复读但可能有幻读PostgreSQLREAD COMMITTED默认解决脏读OracleREAD COMMITTEDSQL ServerREAD COMMITTED五、并发控制锁机制5.1 锁的基本类型锁类型英文含义兼容共享锁S Lock / Shared Lock读锁可以多人同时加S 与 S 兼容S 与 X 不兼容排他锁X Lock / Exclusive Lock写锁只能一人持有X 与任何锁都不兼容5.2 锁的粒度粒度范围并发度开销行锁一行高大页锁一页通常 8KB中中表锁整张表低小数据库锁整个库最低最小InnoDB 默认使用行锁并发度高MyISAM 使用表锁并发度低。5.3 封锁协议一级封锁协议事务修改数据前加X 锁直到事务结束才释放解决丢失修改二级封锁协议一级协议 读取数据前加S 锁读完后立即释放解决丢失修改 读脏数据三级封锁协议一级协议 读取数据前加S 锁直到事务结束才释放解决丢失修改 读脏数据 不可重复读┌────────────────────────────────────────┐ │ 隔离级别 vs 封锁协议对应关系 │ ├────────────────────────────────────────┤ │ READ UNCOMMITTED → 无锁或最低级别 │ │ READ COMMITTED → 二级封锁协议 │ │ REPEATABLE READ → 三级封锁协议 │ │ SERIALIZABLE → 三级封锁协议 锁全表│ └────────────────────────────────────────┘5.4 活锁与死锁活锁Livelock事务 A 申请锁事务 B 也申请同一锁但 B 优先级更高A 一直等待永远得不到执行。解决采用先来先服务FIFO策略避免优先级导致的饥饿。死锁Deadlock两个事务互相等待对方持有的锁形成循环等待。时间事务 A事务 BT1加 X 锁 on 记录 1T2加 X 锁 on 记录 2T3请求 X 锁 on 记录 2等待 BT4请求 X 锁 on 记录 1等待 AT5死锁死锁死锁的解决策略预防一次加锁法事务开始时一次性加所有需要的锁、顺序加锁法按固定顺序加锁检测与解除设置超时时间超时后自动回滚其中一个事务牺牲者等待图DBMS 维护等待图发现环就选择一个事务回滚六、MVCC多版本并发控制6.1 什么是 MVCCMVCCMulti-Version Concurrency Control是不用锁也能实现并发控制的技术。核心思想每个数据项都有多个版本读操作读取的是历史版本写操作创建新版本读和写互不阻塞。6.2 MVCC 如何工作以 InnoDB 为例InnoDB 的每行数据都有两个隐藏列DB_TRX_ID创建该版本的事务 IDDB_ROLL_PTR回滚指针指向该版本的上一个版本形成版本链读操作根据事务的 Read View可见性判断规则找到对该事务可见的最新版本。写操作不直接修改原数据而是创建新版本的行旧版本保留在 Undo 日志中。6.3 MVCC 的优势读不阻塞写写不阻塞读读操作读取历史版本不会等待写锁高并发性能避免了大量锁等待实现快照读REPEATABLE READ 隔离级别下事务内两次读取结果一致七、动手练习练习 1事务基础在 MySQL 中执行以下操作观察事务的行为STARTTRANSACTION;SELECT余额FROM账户WHERE账户号A;-- 记录结果UPDATE账户SET余额余额-100WHERE账户号A;SELECT余额FROM账户WHERE账户号A;-- 查看变化ROLLBACK;-- 撤销SELECT余额FROM账户WHERE账户号A;-- 验证是否恢复练习 2隔离级别实验开启两个 MySQL 客户端窗口分别模拟事务 A 和事务 B测试不同隔离级别下的行为在 READ UNCOMMITTED 下A 修改未提交B 能否读到在 READ COMMITTED 下A 修改未提交B 能否读到A 提交后呢在 REPEATABLE READ 下A 修改并提交B 再次读结果是否变化练习 3死锁模拟在两个会话中执行-- 会话 ABEGIN;UPDATE账户SET余额余额-100WHERE账户号A;-- 暂停UPDATE账户SET余额余额-100WHERE账户号B;-- 等待 B 释放锁COMMIT;-- 会话 BBEGIN;UPDATE账户SET余额余额-100WHERE账户号B;-- 暂停UPDATE账户SET余额余额-100WHERE账户号A;-- 等待 A 释放锁COMMIT;观察哪个事务被回滚以及错误信息。八、常见误区与避坑指南误区正确理解“事务越多越好”长事务占用锁时间长降低并发性能尽量缩小事务范围“SERIALIZABLE 最安全 always 用它”隔离级别越高性能越差大多数场景 READ COMMITTED 或 REPEATABLE READ 足够“InnoDB 的默认隔离级别不会幻读”REPEATABLE READ 下 InnoDB 通过 MVCC 间隙锁解决了大部分幻读但某些场景仍可能“锁越粗越好”粗粒度锁并发度低细粒度锁并发度高但管理复杂“ROLLBACK 很慢”ROLLBACK 利用 Undo 日志恢复通常很快不要因担心性能而不用九、下篇预告下一篇我们将学习数据库恢复技术——当数据库遭遇故障断电、崩溃、误操作时如何通过日志、检查点和备份把数据救回来。

相关新闻

BilibiliDown:免费开源的B站视频下载器终极指南

BilibiliDown:免费开源的B站视频下载器终极指南

2026/7/9 2:49:34

BilibiliDown:免费开源的B站视频下载器终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bili…

2026 AI 招聘智能体实践:视觉语义架构驱动的安全人才寻访方案

2026 AI 招聘智能体实践:视觉语义架构驱动的安全人才寻访方案

2026/7/9 2:49:34

做过招聘数字化的团队大概率都踩过封号的坑:辛辛苦苦养了数月的核心招聘账号,跑几天批量人才寻访就触发风控被永久封禁,甚至连带企业主体受到平台限制。随着 2026 年主流招聘平台全面升级生物行为风控体系,传统基于 DOM 注入、API…

面试官:“现在都是Vibe Coding,你说说你的优势是什么?”,我笑了:“没经验的人,让AI写的代码就是一坨。。”,面试官:“细聊经验”

面试官:“现在都是Vibe Coding,你说说你的优势是什么?”,我笑了:“没经验的人,让AI写的代码就是一坨。。”,面试官:“细聊经验”

2026/7/9 2:39:33

这篇,我来结合自己的经验来说说,有经验的人和没经验的人,Vibe Coding 的差距。 很多录友一聊到 Vibe Coding,就觉得:“这有啥难的,不就是让 AI 干活吗?” 真这么想,项目迟早会被 A…

平价入门CCD相机横向测评资

平价入门CCD相机横向测评资

2026/7/9 4:29:38

社交平台胶片质感相关内容热度持续走高,相关内容月增速37%;抖音CCD相关话题播放量超84亿次,小红书学生CCD自拍笔记半年新增12.6万篇。300元以内、支持手机直传、大容量存储的入门CCD相机,受到学生、青少年群体关注。从中选取六款售…

Meta 推出首个 AI 图像生成模型 Muse Image,还计划推 Muse Video 模型

Meta 推出首个 AI 图像生成模型 Muse Image,还计划推 Muse Video 模型

2026/7/9 4:29:38

Meta 推出 Muse Image,多平台布局 AI 图像生成 Meta 推出由其超级智能实验室部门打造的首个 AI 图像生成模型 Muse Image。目前,该模型已为 Meta AI 应用程序、Instagram 和 WhatsApp 上的图像制作工具提供支持,很快还将在 Facebook 和 Messe…

Cursor快捷键避坑指南,3大高频误操作+4类上下文失效场景,附VS Code迁移对照表

Cursor快捷键避坑指南,3大高频误操作+4类上下文失效场景,附VS Code迁移对照表

2026/7/9 4:29:38

更多请点击: https://kaifayun.com 第一章:Cursor快捷键 CheatSheet Cursor 作为基于 AI 的智能代码编辑器,深度集成 VS Code 快捷键体系并扩展了专属 AI 操作热键。熟练掌握这些快捷键可显著提升代码生成、上下文理解与多文件协同效率。 核…

领英好友乱成一锅粥?用这个分组备注功能,B2B 获客效率翻倍|附干货

领英好友乱成一锅粥?用这个分组备注功能,B2B 获客效率翻倍|附干货

2026/7/9 4:29:38

领英好友乱成一锅粥?用这个分组备注功能,B2B 获客效率翻倍|附干货做外贸、B2B 拓客、猎头的朋友都懂:领英加了几百上千好友,原生不支持分组、不能备注,聊过的客户、意向代理、待跟进线索全混在一起&#xf…

Cursor AI × Angular开发闭环(企业级工程实践大揭秘):从Prompt设计到CI/CD自动集成

Cursor AI × Angular开发闭环(企业级工程实践大揭秘):从Prompt设计到CI/CD自动集成

2026/7/9 4:29:38

更多请点击: https://kaifayun.com 第一章:Cursor AI Angular开发闭环全景图 Cursor AI 与 Angular 的深度协同,正在重塑前端工程化开发范式。它不仅提供智能补全与上下文感知的代码生成能力,更通过本地 LLM 驱动的实时反馈机制…

第 04 课:工具与 Agent 基础

第 04 课:工具与 Agent 基础

2026/7/9 4:19:37

第 04 课:工具与 Agent 基础 配套代码仓库:https://gitee.com/wang-zeyong111/lang-chain-lecture 本课定位 如果模型只能生成文本,它就只是一个“会说话”的系统。工具让模型能够行动:查数据库、算数、调用 API、检索文档、创…

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

2026/7/8 0:44:47

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…

6个月转型AI工程师:实战路径与核心技能

6个月转型AI工程师:实战路径与核心技能

2026/7/8 6:29:42

1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公…

YOLOv5模型剪枝与量化实战:边缘设备部署优化

YOLOv5模型剪枝与量化实战:边缘设备部署优化

2026/7/8 14:04:34

1. 项目背景与核心价值在计算机视觉领域,YOLOv5因其出色的实时检测性能成为工业界宠儿。但当我们尝试将其部署到边缘设备(如树莓派、Jetson Nano或手机终端)时,立刻会遇到两个致命问题:模型体积庞大(原始YO…

平价正宗重庆火锅实测|理性避坑选型指南

平价正宗重庆火锅实测|理性避坑选型指南

2026/7/9 0:09:12

一、引言:重庆火锅消费现存痛点当下大众平价川渝火锅赛道竞争白热化,普通消费者就餐普遍面临三大选型难题:一是口味同质化严重,大量门店采用预制锅底、半成品食材,打着重庆老火锅旗号弱化牛油本味,麻辣口感…

AcFunDown:打破A站视频离线观看壁垒的终极解决方案

AcFunDown:打破A站视频离线观看壁垒的终极解决方案

2026/7/9 0:09:12

AcFunDown:打破A站视频离线观看壁垒的终极解决方案 【免费下载链接】AcFunDown 包含PC端UI界面的A站 视频下载器。支持收藏夹、UP主视频批量下载 😳仅供交流学习使用喔 项目地址: https://gitcode.com/gh_mirrors/ac/AcFunDown 想象一下这样的场景…

【复现】面向新能源消纳能力评估的年负荷序列建模及场景生成方法(Matlab代码实现)

【复现】面向新能源消纳能力评估的年负荷序列建模及场景生成方法(Matlab代码实现)

2026/7/9 0:09:12

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 &#x1f381…