当前位置: 首页 > article >正文

数据库中的锁机制

目录

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

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

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的账户余额,确保在转账过程中其他事务无法读取或修改该余额。这可以避免并发操作导致的余额错误。

相关文章:

数据库中的锁机制

目录 数据库中的锁机制:原理、分类与实际案例详解 一、数据库锁的核心作用与基本概念 1.1 为什么需要数据库锁? 1.2 锁的分类 二、锁机制的实现与典型场景 2.1 共享锁(Shared Lock) 工作原理 适用场景 代码示例(MySQL) 案例分析 2.2 排他锁(Exclusive Lock) …...

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

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

AI日报 - 2025年05月19日

🌟 今日概览 (60秒速览) ▎🤖 大模型前沿 | GPT-5传闻再起,将基于全新模型构建,与GPT-4彻底分离;Claude 3.7 Sonnet系统提示泄露,揭示其主动引导对话、多语言支持及安全新特性;研究指出直接复用…...

Spring源码主线全链路拆解:从启动到关闭的完整生命周期

Spring源码主线全链路拆解:从启动到关闭的完整生命周期 一文看懂 Spring 框架从启动到销毁的主线流程,结合原理、源码路径与伪代码三位一体,系统学习 Spring 底层机制。 1. 启动入口与环境准备 原理说明 Spring Boot 应用入口是标准 Java 应…...

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 环境搭建全流程…...

系统架构设计(十):结构化编程

定义 结构化编程是一种遵循清晰逻辑结构、避免使用 goto 的编程方法。它强调使用有限的三种基本控制结构来组织程序,提高程序的可读性、可维护性和可测试性。 它是现代程序设计的基础,被广泛应用于命令式语言(如 C、Pascal、Java&#xff0…...

标准差和方差是什么

标准差和方差是什么 标准差的简单理解 标准差是衡量一组数据**离散程度(即数据的分散或集中程度 )**的统计量。它表示数据集中每个数值与这组数据平均值的偏离程度。 标准差越大,说明数据越分散,波动越大; 标准差越小,说明数据越集中,波动越小 。 可以把数据想象成一群…...

【周输入】510周阅读推荐-3

前文 【周输入】510周阅读推荐-1-CSDN博客 【周输入】510周阅读推荐-2-CSDN博客 本次推荐 目录 前文 本次推荐 算法技术 模型产品 算法技术 vLLM和DeepSpeed部署模型的优缺点_vllm deepspeed-CSDN博客 优点缺点总结vLLM 适用于推理 优化内存管理 高效并行化 功能单…...

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 纯色壁纸自定义 没一个好看的...

医疗信息系统安全防护体系的深度构建与理论实践融合

一、医疗数据访问系统的安全挑战与理论基础 1.1 系统架构安全需求分析 在医疗信息系统中,基于身份标识的信息查询功能通常采用分层架构设计,包括表现层、应用层和数据层。根据ISO/IEC 27001信息安全管理体系要求,此类系统需满足数据保密性…...

Compose笔记(二十五)--Brush

这一节主要了解一下Compose中Brush,在Jetpack Compose里,Brush是一个重要的 API,它用于定义填充图形的颜色渐变或图案,能够为界面元素添加丰富的视觉效果。简单总结如下: 1 常见场景 填充形状(圆形、矩形等) 创建渐变…...

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

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

HTML 属性详解

HTML 属性详解 HTML(HyperText Markup Language)是创建网页的标准标记语言。在HTML中,元素可以通过属性来扩展其功能。属性是元素的一个特性,它提供了关于元素的额外信息。本文将详细介绍HTML中的常见属性,帮助您更好地理解和运用HTML。 一、HTML属性的基本概念 HTML属…...

NC61 两数之和【牛客网】

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

Java生成可控的Word表格功能开发

在日常办公自动化与系统集成场景中,生成结构化的Word文档已成为一种刚性需求,尤其是带有格式规范、内容动态填充的Word表格(Table)。本文将围绕如何利用Java开发一个可控的Word表格生成功能模块展开,涵盖技术选型、代码实现、边界控制与常见问题处理等方面,帮助开发者快速…...

Node.js中的洋葱模型

文章目录 前言 前言 Node.js中的洋葱模型是一种中间件执行机制,主要用于处理HTTP请求和响应的流程控制。该模型通过层层包裹的中间件结构,实现请求从外到内穿透、响应从内向外返回的顺序执行。以下从核心概念、实现原理、框架差异及实际应用等方面解析&…...

Spring Boot 中 MyBatis 与 Spring Data JPA 的对比介绍

一、核心概念 MyBatis 定义:基于 SQL 的持久层框架,提供灵活的 SQL 映射和自定义查询能力。 特点: 开发者手动编写 SQL(XML 或注解)。 支持动态 SQL、复杂查询优化。 轻量级,对数据库控制力强。 Spri…...

如何分析动态采样引起的计划不稳定 | 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…...

C语言中的指针:从基础到进阶实战

指针是C语言中最具特色且功能强大的特性之一。它们不仅是内存管理的核心工具&#xff0c;还能帮助程序员实现复杂的数据结构和高效算法。本文将从指针的基础知识入手&#xff0c;逐步深入探讨其高级应用&#xff0c;结合实际示例&#xff0c;助你掌握指针的精髓。 一、指针的基…...

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

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