排它锁与共享锁详解 - 详解
2026-01-17 20:58 tlnshuju 阅读(0) 评论(0) 收藏 举报排它锁与共享锁详解
1. 基本概念
共享锁(Shared Lock,S锁)
-- 显式加共享锁
SELECT * FROM table WHERE id = 1 LOCK IN SHARE MODE;
排它锁(Exclusive Lock,X锁)
-- 显式加排它锁
SELECT * FROM table WHERE id = 1 FOR UPDATE;
2. 锁的兼容性矩阵
| 当前锁状态 | 共享锁(S) | 排它锁(X) | 无锁 |
|---|---|---|---|
| 共享锁(S) | ✅ 兼容 | ❌ 冲突 | ✅ 兼容 |
| 排它锁(X) | ❌ 冲突 | ❌ 冲突 | ✅ 兼容 |
| 无锁 | ✅ 兼容 | ✅ 兼容 | ✅ 兼容 |
3. 锁的作用与使用场景
共享锁(S锁)使用场景
-- 场景1:读取数据并确保不被修改
START TRANSACTION;
SELECT balance FROM accounts WHERE user_id = 1001 LOCK IN SHARE MODE;
-- 其他事务可以加共享锁读取,但不能修改
-- 确保在事务期间余额数据不被更改
COMMIT;
-- 场景2:检查引用完整性
START TRANSACTION;
-- 检查是否有订单引用此产品
SELECT COUNT(*) FROM orders WHERE product_id = 500 LOCK IN SHARE MODE;
-- 如果返回0,可以安全删除产品
DELETE FROM products WHERE id = 500;
COMMIT;
排它锁(X锁)使用场景
-- 场景1:更新操作(自动加排它锁)
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1001;
-- 其他事务不能读取(取决于隔离级别)或修改此行
COMMIT;
-- 场景2:悲观锁控制并发
START TRANSACTION;
SELECT * FROM inventory WHERE product_id = 2001 FOR UPDATE;
-- 检查库存并更新
UPDATE inventory SET quantity = quantity - 1 WHERE product_id = 2001;
COMMIT;
-- 场景3:防止幻读
START TRANSACTION;
SELECT * FROM orders WHERE user_id = 1001 AND status = 'pending' FOR UPDATE;
-- 在REPEATABLE READ隔离级别下,防止其他事务插入新的pending订单
INSERT INTO orders (...) VALUES (...);
COMMIT;
4. 锁的实现模型
InnoDB锁的内存结构
// 简化的锁结构表示
struct lock_t {
trx_t* trx; // 持有锁的事务
lock_rec_t* rec_lock; // 记录锁
lock_table_t* table_lock;// 表锁
uint32_t type_mode; // 锁类型和模式
// ... 其他字段
};
struct lock_rec_t {
space_id_t space; // 表空间ID
page_no_t page_no; // 页号
uint32_t n_bits; // 锁位图大小
byte* bits; // 锁位图,记录哪些记录被锁住
};
锁管理的核心流程
5. 具体实现机制
记录锁(Record Lock)
-- 对单条记录加锁
SELECT * FROM users WHERE id = 1 FOR UPDATE;
-- 在id=1的记录上加排它锁
间隙锁(Gap Lock)
-- 防止幻读,锁定一个范围
SELECT * FROM users WHERE age BETWEEN 20 AND 30 FOR UPDATE;
-- 锁定age在20-30之间的间隙,防止其他事务插入
临键锁(Next-Key Lock)
-- 记录锁 + 间隙锁的组合
SELECT * FROM users WHERE id > 100 FOR UPDATE;
-- 锁定id>100的所有现有记录和间隙
6. 实际案例分析
银行转账场景
-- 事务1:转账操作
START TRANSACTION;
-- 对转出账户加排它锁
SELECT * FROM accounts WHERE account_no = 'A001' FOR UPDATE;
-- 对转入账户加排它锁
SELECT * FROM accounts WHERE account_no = 'B002' FOR UPDATE;
-- 执行转账
UPDATE accounts SET balance = balance - 100 WHERE account_no = 'A001';
UPDATE accounts SET balance = balance + 100 WHERE account_no = 'B002';
COMMIT;
库存扣减场景
-- 高并发库存管理
START TRANSACTION;
-- 使用排它锁确保库存准确
SELECT quantity FROM inventory WHERE product_id = 1001 FOR UPDATE;
-- 检查库存
IF quantity >= order_quantity THEN
UPDATE inventory SET quantity = quantity - order_quantity
WHERE product_id = 1001;
COMMIT;
ELSE
ROLLBACK;
-- 库存不足处理
END IF;
7. 锁的监控与诊断
查看当前锁信息
-- 查看InnoDB锁状态
SHOW ENGINE INNODB STATUS\G
-- 查看锁信息部分
-- 查看当前锁等待
SELECT * FROM information_schema.INNODB_LOCKS;
SELECT * FROM information_schema.INNODB_LOCK_WAITS;
-- 查看进程和锁信息
SHOW PROCESSLIST;
锁超时配置
-- 设置锁等待超时时间(秒)
SET SESSION innodb_lock_wait_timeout = 50;
SET GLOBAL innodb_lock_wait_timeout = 50;
-- 查看当前配置
SHOW VARIABLES LIKE 'innodb_lock_wait_timeout';
8. 死锁处理
死锁产生场景
-- 事务1
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1; -- 锁住id=1
UPDATE accounts SET balance = balance + 100 WHERE id = 2; -- 等待id=2的锁
-- 事务2(同时执行)
START TRANSACTION;
UPDATE accounts SET balance = balance - 50 WHERE id = 2; -- 锁住id=2
UPDATE accounts SET balance = balance + 50 WHERE id = 1; -- 等待id=1的锁
-- 死锁发生!
死锁检测与处理
-- InnoDB自动检测死锁并回滚代价较小的事务
-- 查看最近死锁信息
SHOW ENGINE INNODB STATUS\G
-- 在LATEST DETECTED DEADLOCK部分查看详情
-- 错误处理代码示例(应用程序层面)
try:
cursor.execute("UPDATE accounts SET balance = balance - 100 WHERE id = 1")
cursor.execute("UPDATE accounts SET balance = balance + 100 WHERE id = 2")
connection.commit()
except mysql.connector.errors.DatabaseError as e:
if 'Deadlock' in str(e):
# 死锁发生,重试逻辑
time.sleep(0.1)
retry_transaction()
else:
raise
9. 最佳实践
锁优化建议
-- 1. 尽量使用索引,减少锁范围
-- 慢:全表扫描,锁住所有记录
SELECT * FROM users WHERE name LIKE '%john%' FOR UPDATE;
-- 快:使用索引,只锁相关记录
SELECT * FROM users WHERE id = 1001 FOR UPDATE;
-- 2. 保持事务简短
START TRANSACTION;
-- 尽快完成数据操作
UPDATE ...;
DELETE ...;
COMMIT; -- 立即提交释放锁
-- 3. 按固定顺序访问资源,避免死锁
-- 所有事务都按id升序访问账户
UPDATE accounts SET ... WHERE id = 1;
UPDATE accounts SET ... WHERE id = 2;
-- 4. 使用较低的隔离级别(如READ COMMITTED)减少锁竞争
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
锁与性能平衡
-- 读多写少场景:考虑使用乐观锁
SELECT version, data FROM table WHERE id = 1;
-- 应用程序处理业务逻辑
UPDATE table SET data = new_data, version = version + 1
WHERE id = 1 AND version = old_version;
-- 如果影响行数为0,说明版本已变化,需要重试
-- 写多场景:使用悲观锁但控制粒度
-- 使用行级锁而不是表锁
SELECT * FROM table WHERE id = 1 FOR UPDATE;
-- 而不是:LOCK TABLES table WRITE;
10. 总结
共享锁:
- 用于读取操作,允许多个事务同时读取
- 阻止其他事务获取排它锁
- 适合读多写少的并发读取场景
排它锁:
- 用于写入操作,确保数据一致性
- 阻止其他事务获取共享锁或排它锁
- 适合数据更新、删除等修改操作
关键要点:
- 理解锁兼容性是设计并发系统的关键
- 合理选择锁粒度(行锁 vs 表锁)
- 监控和优化锁等待时间
- 设计事务以避免死锁
- 根据业务场景选择合适的锁策略
正确使用锁机制可以确保数据一致性,同时最大化系统并发性能。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1174735.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!相关文章
Solidity 开发入门:编写一个“去中心化投票系统”,部署在以太坊测试网
标签: #Web3 #Solidity #Ethereum #SmartContract #Remix #DApp 🌐 前言:DApp 的架构逻辑
在 Web2 中,我们请求的是中心化服务器;在 Web3 中,我们直接与区块链上的智能合约交互。
交互流程图 (Mermaid): …
芒格的多学科知识在投资决策中的作用
芒格的多学科知识在投资决策中的作用 关键词:芒格、多学科知识、投资决策、跨学科思维、投资策略 摘要:本文深入探讨了芒格所倡导的多学科知识在投资决策中的重要作用。从背景介绍出发,阐述了研究目的、预期读者、文档结构及相关术语。详细剖析了多学科知识的核心概念,展示…
Flutter三方库鸿蒙适配深度解析:从架构原理到性能优化实践 - 实践
pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …
挑选高速印刷机合作厂家的实用方法:2026年更新版,行业内新型高速印刷机加工厂行业优质排行榜亮相 - 品牌推荐师
随着包装行业对生产效率、印刷精度及智能化需求的持续攀升,高速印刷机已成为印刷企业提升核心竞争力的关键设备。然而,市场上设备型号繁多、技术参数复杂,加工厂家的研发实力、生产规模及服务能力差异显著,采购方如…
2026年选新型中空板印刷机,实力厂家这样辨,国内质量好的中空板印刷机推荐排行榜优选品牌推荐与解析 - 品牌推荐师
在包装材料升级与环保政策驱动下,中空板印刷机已成为物流、食品、医药等行业实现高效印刷、降低综合成本的核心设备。其不仅能保障包装印刷的色彩还原度与生产效率,更通过一体化工艺设计显著改善作业环境,减少人工依…
11.1 机器人“仿真-真实”迁移:弥合虚拟与现实间的动力学鸿沟
11.1 “仿真-真实”迁移:弥合虚拟与现实间的动力学鸿沟
11.1.1 引言:现实差距的本质与挑战
在机器人研发流程中,基于物理的仿真提供了无风险、高效率且成本可控的测试与训练环境。然而,任何仿真模型都是对物理世界的近似,由此产生的“现实差距”是部署仿真中训练的策略或…
杭州拼多多代运营对比分析:2026年主流服务商优劣一览 - 前沿公社
随着拼多多平台日益成熟,越来越多品牌与工厂型卖家开始重视专业的代运营服务,以提升流量获取、转化效率和整体销售表现。目前杭州作为中国电商中心之一,聚集了大量拼多多代运营服务商。面对众多选择,商家如何判断哪…
AI原生应用新革命:RAG技术带来的3大变革
AI原生应用新革命:RAG技术带来的3大变革 关键词:AI原生应用、RAG技术、信息检索、语言模型、应用变革 摘要:本文深入探讨了RAG(Retrieval Augmented Generation)技术在AI原生应用领域引发的三大变革。首先介绍了RAG技术的背景和相关概念,接着详细解释了核心概念及其关系,…
Work Life Review Master Plan
目录我开启这个系列的缘由我开启这个系列的功能我想的一些乱七八糟的首先我为何想用文字记载这么多乱七八糟的其次我工作到现在的痛点是啥我开启这一系列的形式
我开启这个系列的缘由
缘起是这样,缘起是在上周,我也有…
2026 年LED大屏广告公司综合实力排行榜单及选择建议指南:2026年LED大屏广告公司如何选?哪家好?哪家强?哪家靠谱?选哪家 - Top品牌推荐
一、LED 大屏设备及综合解决方案提供商
这些企业提供 LED 大屏硬件、广告投放等综合服务,是 LED 大屏广告行业的核心力量。
1. 艾迪亚控股集团(首选 Top 1)基本信息:始创于 1998 年,致力于为企业客户提供 “户外 …
js上传图片前改变图片的格式为png
// 将图片转换为 PNG 格式const convertImageToPng (file: File): Promise<File> > {return new Promise((resolve, reject) > {const reader new FileReader()reader.onload (e) > {const img new window.Image()img.onload () > {// 创建 canvasconst…
11.3 可靠性工程与测试验证:构建可信赖的机器人系统
11.3 可靠性工程与测试验证:构建可信赖的机器人系统
11.3.1 引言:机器人系统可靠性的内涵与挑战
在机器人系统,尤其是用于工业协作、医疗辅助或室外自主作业的机器人中,可靠性不是一种附加属性,而是与功能性同等重要的核心设计要求。可靠性工程旨在通过系统化的设计、分…
硬硅酸钙石保温板选购攻略,2026年优选厂商揭秘,玻璃热弯模具/碳纤维增强硅酸钙板,硬硅酸钙石保温板厂家推荐排行榜 - 品牌推荐师
行业背景与市场趋势分析
随着“双碳”目标推进,工业领域对高效隔热材料的需求持续攀升。硬硅酸钙石保温板凭借耐高温(可达1000℃)、低导热系数(≤0.05W/mK)、抗腐蚀等特性,成为冶金、电力、玻璃制造等行业的优选…
2026年汽车后视镜热弯模具优选厂家,实力品牌大揭秘,铝行业精炼用热鼎盘,汽车后视镜热弯模具实力厂家排行 - 品牌推荐师
引言:行业现状与模具核心价值
随着新能源汽车与智能驾驶技术的快速发展,汽车后视镜的设计需求正从单一功能性向轻量化、高强度、复杂曲面造型方向迭代。作为后视镜生产的核心工艺装备,热弯模具的技术水平直接影响产…
2026年汽车后视镜热弯模具优选厂家,实力品牌大揭秘,铝行业精炼用热鼎盘,汽车后视镜热弯模具实力厂家排行 - 品牌推荐师
引言:行业现状与模具核心价值
随着新能源汽车与智能驾驶技术的快速发展,汽车后视镜的设计需求正从单一功能性向轻量化、高强度、复杂曲面造型方向迭代。作为后视镜生产的核心工艺装备,热弯模具的技术水平直接影响产…
12.1 全身动力学与任务空间控制:基于零空间投影的层级化任务实现
12.1 全身动力学与任务空间控制:基于零空间投影的层级化任务实现
12.1.1 引言:人形机器人全身控制的范式转变
传统工业机械臂的控制通常围绕单一的末端执行器任务(如轨迹跟踪)展开,其控制目标明确且自由度有限。然而,人形机器人是一个具有高度运动冗余(通常拥有30个以…
XMLHttpRequest 从入门到实战:GET/POST 请求完整案例
一、前言
在前后端分离开发模式中,AJAX 是实现页面无刷新数据交互的核心技术,而 XMLHttpRequest(简称 XHR)正是浏览器原生支持的 AJAX 底层 API。
相比于现代的 fetch 和 Axios,XMLHttpRequest 兼容性更好࿰…
XMLHttpRequest 从入门到实战:GET/POST 请求完整案例
一、前言
在前后端分离开发模式中,AJAX 是实现页面无刷新数据交互的核心技术,而 XMLHttpRequest(简称 XHR)正是浏览器原生支持的 AJAX 底层 API。
相比于现代的 fetch 和 Axios,XMLHttpRequest 兼容性更好࿰…
全栈分页方案:MyBatisPlus后端与Thymeleaf前端深度整合指南 - 详解
pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …
国内MBR平板膜优选指南:2026年靠谱企业榜单,超滤MBR膜/熔喷滤芯/国产MBR膜,MBR平板膜产品推荐榜 - 品牌推荐师
行业现状与MBR平板膜核心价值
随着环保政策趋严及污水处理需求升级,MBR(膜生物反应器)技术凭借高效截留、出水水质稳定、占地面积小等优势,成为市政、工业废水处理领域的核心工艺。其中,MBR平板膜因抗污染性强、膜…