数据库中的锁机制

news2025/5/19 9:41:55

目录

数据库中的锁机制:原理、分类与实际案例详解

一、数据库锁的核心作用与基本概念

1.1 为什么需要数据库锁?

1.2 锁的分类

二、锁机制的实现与典型场景

2.1 共享锁(Shared Lock)

工作原理

适用场景

代码示例(MySQL)

案例分析

2.2 排他锁(Exclusive Lock)

工作原理

适用场景

代码示例(SQL Server)

案例分析

2.3 意向锁(Intention Lock)

工作原理

适用场景

代码示例(MySQL)

案例分析

2.4 行级锁(Row-Level Lock)

工作原理

适用场景

代码示例(MySQL 8.0+)

案例分析

2.5 表级锁(Table-Level Lock)

工作原理

适用场景

代码示例(MySQL)

案例分析

2.6 乐观锁(Optimistic Lock)

工作原理

适用场景

代码示例(Java + MySQL)

案例分析

2.7 悲观锁(Pessimistic Lock)

工作原理

适用场景

代码示例(SQL Server)

案例分析

三、锁机制的优缺点与适用场景

3.1 行级锁 vs 表级锁

3.2 乐观锁 vs 悲观锁

四、锁机制的实际应用与最佳实践

4.1 防止死锁的策略

解决方案

4.2 监控与优化锁性能

4.3 典型场景的锁选择

五、总结

数据库中的锁机制:原理、分类与实际案例详解

一、数据库锁的核心作用与基本概念

1.1 为什么需要数据库锁?

数据库锁是数据库管理系统(DBMS)实现并发控制的核心机制。在多用户并发操作的场景下,多个事务可能同时访问或修改相同的数据资源。如果没有锁机制,可能会导致以下问题:

  • 脏读(Dirty Read):一个事务读取了另一个未提交事务的修改数据。
  • 不可重复读(Non-Repeatable Read):一个事务内多次读取同一数据,由于其他事务的修改,结果不一致。
  • 幻读(Phantom Read):一个事务内两次查询同一范围的数据时,因其他事务插入或删除数据,结果集发生变化。

锁机制通过限制事务对数据的访问和修改权限,确保事务的原子性、一致性、隔离性(ACID特性中的隔离性),从而避免上述问题。

1.2 锁的分类

根据锁的粒度和类型,数据库锁可以分为以下几类:

  1. 按锁粒度划分

    • 行级锁(Row-Level Lock):锁定单行数据,适用于高并发写入场景。
    • 表级锁(Table-Level Lock):锁定整张表,适用于批量操作或表结构修改。
    • 页级锁(Page-Level Lock):锁定数据页(如InnoDB的页),介于行级锁和表级锁之间。
    • 数据库级锁(Database-Level Lock):锁定整个数据库实例,通常用于备份或维护。
  2. 按锁类型划分

    • 共享锁(Shared Lock, S锁):允许多个事务同时读取同一资源,但禁止修改。
    • 排他锁(Exclusive Lock, X锁):独占资源,禁止其他事务读取或修改。
    • 意向锁(Intention Lock):表明事务即将在表的某个层级上施加锁(如IX锁、IS锁)。
    • 乐观锁(Optimistic Lock):假设数据冲突较少,仅在提交时检查冲突(如版本号机制)。
    • 悲观锁(Pessimistic Lock):假设数据冲突较多,在读取时立即加锁。

二、锁机制的实现与典型场景

2.1 共享锁(Shared Lock)

工作原理

共享锁允许多个事务同时读取同一资源,但禁止任何事务修改该资源。当事务A对某行数据加共享锁后,其他事务可以读取该行数据,但不能对其进行更新或删除。

适用场景
  • 数据读取操作(如报表生成、数据分析)。
  • 多用户同时查询同一资源的场景。
代码示例(MySQL)
-- 事务1:对id=1的记录加共享锁
BEGIN;
SELECT * FROM employees WHERE id = 1 LOCK IN SHARE MODE;
-- 其他事务可以读取该行,但无法修改
COMMIT;

-- 事务2:尝试修改id=1的记录(会被阻塞)
BEGIN;
UPDATE employees SET salary = 5000 WHERE id = 1;
COMMIT;
案例分析

假设有一个employees表,事务1通过共享锁读取某员工的工资信息。此时,事务2无法修改该员工的工资,直到事务1提交或回滚。这种方式确保了数据在读取期间的一致性。

2.2 排他锁(Exclusive Lock)

工作原理

排他锁独占资源,禁止其他事务读取或修改被锁定的数据。当事务A对某行数据加排他锁后,其他事务既不能读取也不能修改该行数据。

适用场景
  • 数据写入操作(如订单创建、账户余额更新)。
  • 防止脏读和不可重复读的场景。
代码示例(SQL Server)
-- 事务1:对id=1的记录加排他锁
BEGIN TRANSACTION;
SELECT * FROM Employees WHERE EmployeeID = 1 WITH (XLOCK);
-- 更新操作
UPDATE Employees SET Salary = 6000 WHERE EmployeeID = 1;
COMMIT TRANSACTION;

-- 事务2:尝试读取id=1的记录(会被阻塞)
BEGIN TRANSACTION;
SELECT * FROM Employees WHERE EmployeeID = 1;
COMMIT TRANSACTION;
案例分析

在银行转账场景中,事务1通过排他锁锁定用户A的账户余额,确保在转账过程中其他事务无法读取或修改该余额。这可以避免并发操作导致的余额错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2379184.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络入侵检测】基于Suricata源码分析运行模式(Runmode)

【作者主页】只道当时是寻常 【专栏介绍】Suricata入侵检测。专注网络、主机安全,欢迎关注与评论。 1. 概要 👋 在 Suricata 中抽象出线程、线程模块和队列三个概念:线程类似进程,可多线程并行执行操作;监听、解码、检…

Linux常用命令(十四)

目录 vi编辑器命令 1-编辑模式 1)准备一个txt文件并且进入vi 2)按i进入编辑模式 3)按o进入编辑模式 4)按a进入编辑模式 ​ 2-底行模式 1)退出vim 2)撤销上次操作 3)设置行号底行模式 4&#xff…

规则联动引擎GoRules初探

背景说明 嵌入式设备随着物联网在生活和生产中不断渗透而渐渐多起来,数据的采集、处理、分析在设备侧的自定义配置越来越重要。一个可通过图形化配置的数据处理过程,对于加速嵌入式设备的功能开发愈发重要。作为一个嵌入式软件从业者,笔者一…

基于OpenCV中的图像拼接方法详解

文章目录 引言一、图像拼接的基本流程二、代码实现详解1. 准备工作2. 特征检测与描述detectAndDescribe 函数详解(1)函数功能(2)代码解析(3)为什么需要这个函数?(4)输出数…

AI大模型学习二十六、使用 Dify + awesome-digital-human-live2d + ollama + ChatTTS打造数字人

一、说明 数字人(Digital Human) 是指通过人工智能(AI)、计算机图形学、语音合成、动作捕捉等技术创建的虚拟人物。它们具备高度拟人化的外观、语言、表情和动作,能够与人类进行交互,甚至承担特定社会角色。…

HTML-3.2 表格的跨行跨列(课表制作实例)

本系列可作为前端学习系列的笔记,代码的运行环境是在HBuilder中,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。 系列文章目录 HTML-1.1 文本字体样式-字体设置、分割线、段落标签、段内回车以及特殊符号 HTML…

Spring Cloud Sentinel 快速入门与生产实践指南

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言:流量洪峰下的微服务守卫战 🛡️一、Sentinel 核心架构解析1.1 Sentinel 整体架构1.2 核心处理流程 二、快速入门实战2.1 环境搭建全流程…

Android平台GB28181设备接入与功能支持详解

GB28181协议作为中国国家标准,广泛应用于安防、智慧城市和交通监控等领域。大牛直播SDK提供了全面支持GB28181设备接入的技术方案,能够有效帮助开发者实现设备的快速接入与管理。在本文中,我们将深入介绍大牛直播SDK在Android平台上对于GB281…

mvc-ioc实现

IOC 1)耦合/依赖 依赖,是谁离不开谁 就比如上诉的Controller层必须依赖于Service层,Service层依赖于Dao 在软件系统中,层与层之间存在依赖。我们称之为耦合 我们系统架构或者设计的一个原则是&#xff…

Windows 11 C:\Windows\Web\Wallpaper

Windows 11 C:\Windows\Web\Wallpaper 纯色壁纸自定义 没一个好看的

Spring Web MVC————入门(3)

今天我们来一个大练习,我们要实现一个登录界面,登录进去了先获取到登录人信息,可以选择计算器和留言板两个功能,另外我们是学后端的,对于前端我们会些基础的就行了,知道ajax怎么用,知道怎么关联…

NC61 两数之和【牛客网】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路3.1 排序双指针3.1 散列 四、参考代码4.1 排序双指针4.2 散列 零、原题链接 NC61 两数之和 一、题目描述 二、测试用例 三、解题思路 3.1 排序双指针 基本思路:   先对序列进行排序,然后…

如何分析动态采样引起的计划不稳定 | OceanBase SQL 调优实践

这篇博客涉及两个知识点,一个是动态采样,另一个是 DAS 执行。 用户的问题和相关结论 我们看看用户在OceanBase 社区论坛发帖中提出的疑问及其所得出的结论。 问题:收集统计信息之前,为什么会出现计划不稳定的情况? …

如何实现RTSP和RTMP低至100-200ms的延迟:直播SDK的技术突破

在实时音视频传输中,低延迟是直播应用的核心技术要求之一。无论是在线教育、远程医疗,还是实时互动直播,延迟过大会影响用户体验,甚至导致应用无法正常使用。大牛直播SDK(SmartMediaKit)在RTSP和RTMP播放器…

symfonos: 2靶场

symfonos: 2 来自 <https://www.vulnhub.com/entry/symfonos-2,331/> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182&#xff0c;靶场IP192.168.23.253 3&…

【图像生成大模型】Step-Video-T2V:下一代文本到视频生成技术

Step-Video-T2V&#xff1a;下一代文本到视频生成技术 引言Step-Video-T2V 项目概述核心技术1. 视频变分自编码器&#xff08;Video-VAE&#xff09;2. 3D 全注意力扩散 Transformer&#xff08;DiT w/ 3D Full Attention&#xff09;3. 视频直接偏好优化&#xff08;Video-DPO…

深度学习推理引擎---ONNX Runtime

一、基础概念 1. 什么是ONNX Runtime&#xff1f; 定位&#xff1a;由微软开发的跨平台推理引擎&#xff0c;专为优化ONNX&#xff08;Open Neural Network Exchange&#xff09;模型的推理性能设计。目标&#xff1a;提供高效、可扩展的推理能力&#xff0c;支持从云到边缘的…

VueUse/Core:提升Vue开发效率的实用工具库

文章目录 引言什么是VueUse/Core&#xff1f;为什么选择VueUse/Core&#xff1f;核心功能详解1. 状态管理2. 元素操作3. 实用工具函数4. 浏览器API封装5. 传感器相关 实战示例&#xff1a;构建一个拖拽上传组件性能优化技巧与原生实现对比常见问题解答总结 引言 在现代前端开发…

【论文阅读】A Survey on Multimodal Large Language Models

目录 前言一、 背景与核心概念1-1、多模态大语言模型&#xff08;MLLMs&#xff09;的定义 二、MLLMs的架构设计2-1、三大核心模块2-2、架构优化趋势 三、训练策略与数据3-1、 三阶段训练流程 四、 评估方法4-1、 闭集评估&#xff08;Closed-set&#xff09;4-2、开集评估&…

vue3 elementplus tabs切换实现

Tabs 标签页 | Element Plus <template><!-- editableTabsValue 是当前tab 的 name --><el-tabsv-model"editableTabsValue"type"border-card"editableedit"handleTabsEdit"><!-- 这个是标签面板 面板数据 遍历 editableT…