SQL Server 的鎖機制

SQL Server 的鎖機制是為了確保數據的一致性和事務的隔離性而設計的。以下是針對讀寫操作的鎖定行為的詳細說明:

1. 鎖的基本類型

SQL Server 的鎖主要分為以下幾類:

共享鎖(Shared Lock, S Lock)

用於讀操作(如 SELECT)。

允許多個事務同時持有共享鎖,但其他事務不能對同一資源加排他鎖。

鎖定期間,其他事務只能讀取,不能修改。

排他鎖(Exclusive Lock, X Lock)

用於寫操作(如 INSERT, UPDATE, DELETE)。

同一時間只能有一個事務持有排他鎖,且其他事務無法對該資源加任何鎖(包括共享鎖)。

鎖定期間,其他事務既不能讀取也不能修改。

更新鎖(Update Lock, U Lock)

用於潛在的寫操作(例如 UPDATE 前需要先讀取數據)。

更新鎖與共享鎖兼容,但與其他更新鎖或排他鎖不兼容。

目的是防止多個事務同時對同一資源進行更新。

意向鎖(Intent Lock)

表示事務將在更細粒度的層次(如行或頁)上加鎖。

例如:意向排他鎖(IX Lock) 表示事務可能在某行加排他鎖,避免其他事務對整個表加鎖。

2. 讀操作(Read)的鎖定行為

默認行為(取決於隔離級別)
在默認的 READ COMMITTED 隔離級別下:

事務會在讀取數據時加共享鎖(S Lock),並在讀取完成後立即釋放鎖(即使事務未提交)。

這種行為可能導致「不可重複讀」(Non-Repeatable Read)。

不同隔離級別的鎖定差異

READ UNCOMMITTED:不加共享鎖,允許讀取未提交的數據(可能髒讀)。

REPEATABLE READ:共享鎖會持有到事務結束,確保可重複讀。

SERIALIZABLE:對範圍加鎖(鍵範圍鎖),防止幻讀(Phantom Read)。

使用 NOLOCK 提示

sql:
SELECT * FROM Table WITH (NOLOCK)
跳過共享鎖,直接讀取數據(可能讀到未提交或正在修改的數據)。

犧牲一致性換取高並發,需謹慎使用。

3. 寫操作(Write)的鎖定行為

事務在修改數據前,會先嘗試獲取更新鎖(U Lock)(用於定位需修改的數據)。

找到目標數據後,更新鎖會升級為排他鎖(X Lock)。

排他鎖會持有到事務結束(提交或回滾)。

鎖定粒度

默認鎖定粒度為行級鎖(Row-Level Lock)。

若鎖定行數過多,可能觸發鎖升級(Lock Escalation),升級為頁鎖或表鎖。

4. 鎖的兼容性

不同類型的鎖之間的兼容性如下表:

當前鎖模式 請求共享鎖(S) 請求排他鎖(X) 請求更新鎖(U)
共享鎖(S) ✔ ✖ ✔
排他鎖(X) ✖ ✖ ✖
更新鎖(U) ✔ ✖ ✖
共享鎖與更新鎖兼容:允許其他事務讀取數據,但禁止其他更新操作。

排他鎖與所有鎖不兼容:確保寫操作的獨占性。

5. 鎖的粒度(Lock Granularity)

SQL Server 支持多種鎖粒度:

行鎖(Row Lock):鎖定單行,並發性最高。

頁鎖(Page Lock):鎖定 8KB 的數據頁。

表鎖(Table Lock):鎖定整個表,並發性最低。

鍵範圍鎖(Key-Range Lock):用於 SERIALIZABLE 隔離級別,防止幻讀。

鎖粒度由 SQL Server 動態管理,通常無需手動干預。

6. 死鎖(Deadlock)

兩個事務互相等待對方釋放鎖。

解決機制:SQL Server 會自動檢測死鎖,並選擇一個事務作為「犧牲者」回滾。

避免方法:

保持事務簡短,減少鎖持有時間。

按相同順序訪問資源(例如先表A後表B)。

使用 SET DEADLOCK_PRIORITY 控制優先級。

7. 監控鎖定

動態管理視圖(DMV)

sql
– 查看當前鎖定狀態
SELECT * FROM sys.dm_tran_locks;

– 查看阻塞的會話
SELECT * FROM sys.dm_os_waiting_tasks;
Profiler / Extended Events
可追蹤 Lock:Acquired 和 Lock:Released 事件。

8. 實踐

選擇合適的隔離級別:避免過度使用 SERIALIZABLE。

避免長事務:減少鎖持有時間。

使用索引:精確鎖定目標數據,減少鎖升級。

考慮行版本控制(如 READ_COMMITTED_SNAPSHOT):通過版本隔離避免讀寫阻塞。

通過理解鎖的行為,可以更好地設計事務和優化並發性能,同時避免阻塞和死鎖問題。

附: SQL SERVER Transaction的隔离级别
在这里插入图片描述

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

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

相关文章

AIP目录

专注于开发灵活API的设计文档。 AIP是总结了谷歌API设计决策的设计文档,它也为其他人提供了用文档记录API设计规则和实践的框架和系统。 基础1AIP目的和指南2AIP编号规则3AIP版本管理200先例8AIP风格与指导9术语表流程100API设计评审常见问题205Beta版本发布前置条…

CSS进度条带斑马纹动画(有效果图)

效果图 .wxml <view class"tb"><view class"tb-line" style"transform:translateX({{w%}})" /> </view> <button bind:tap"updateLine">增加进度</button>.js Page({data: {w:0,},updateLine(){this.…

【工具-Krillin AI】视频翻译、配音、语音克隆于一体的一站式视频多语言转换工具~

Krillin AI 是全能型音视频本地化与增强解决工具。这款简约而强大的工具&#xff0c;集音视频翻译、配音、语音克隆于一身&#xff0c;支持横竖屏格式输出&#xff0c;确保在所有主流平台&#xff08;哔哩哔哩&#xff0c;小红书&#xff0c;抖音&#xff0c;视频号&#xff0c…

zset.

zset 有序集合 zset 保留了 set 不能有重复元素的特点 zset 中的每个元素都有一个唯一的浮点类型的分数&#xff08;score&#xff09;与之关联&#xff0c;使得 zset 内部的元素是可以维护有序性的。但是这个有序不是用下标作为排序依据的&#xff0c;而是根据分数&#xf…

Spring 数据库编程

Spring JDBC 传统的JDBC在操作数据库时&#xff0c;需要先打开数据库连接&#xff0c;执行SQL语句&#xff0c;然后封装结果&#xff0c;最后关闭数据库连接等资源。频繁的数据库操作会产生大量的重复代码&#xff0c;造成代码冗余&#xff0c;Spring的JDBC模块负责数据库资源…

492Q 型气缸盖双端面铣削组合铣床总体设计

一、引言 492Q 型气缸盖是发动机的重要组成部分&#xff0c;其双端面的加工精度对发动机的性能和可靠性有着重要影响。设计一款适用于 492Q 型气缸盖双端面铣削的组合铣床&#xff0c;能够提高加工效率和质量&#xff0c;满足发动机生产的需求。 二、总体设计要求 加工精度&…

颚式破碎机的设计

一、引言 颚式破碎机作为矿山、建材等行业的重要破碎设备&#xff0c;其性能优劣直接影响物料破碎效率与质量。随着工业生产规模的扩大和对破碎效率要求的提高&#xff0c;设计一款高效、稳定、节能的颚式破碎机具有重要意义。 二、设计需求分析 处理能力&#xff1a;根据目…

第三阶段面试题

Nginx nginx常用模块以及其功能 proxy模块&#xff0c;进行代理功能 ssl模块&#xff0c;进行HTTPS协议的使用 gzip模块&#xff0c;进行传输数据的压缩 upstream模块&#xff0c;进行反向代理时使用 static模块&#xff0c;静态资源进行访问的模块 cache模块&#xff0…

鸿蒙NEXT开发键盘工具类(ArkTs)

export declare type KeyboardCallBack (show: boolean, height: number) > void; import { AppUtil } from ./AppUtil; import { LogUtil } from ./LogUtil; import { ArrayUtil } from ./ArrayUtil;/*** 键盘工具类* author 鸿蒙布道师* since 2025/04/18*/ export class…

基于 LabVIEW 的电液伺服阀测试台开发

开发了一种基于 LabVIEW 图形编程语言的自动测试系统&#xff0c;能够完成电液伺服阀的空载流量特性、压力增益特性、内泄漏特性等静态特性的自动测试。针对测试过程中干扰信号频段与正常信号频段接近&#xff0c;普通数字滤波器滤波效果不佳的问题&#xff0c;采用迭代滤波分解…

【uniapp】vue2 使用 Vuex 状态管理

创建store文件夹&#xff1a;store/index.js // index.js import Vue from vue import Vuex from vuex import address from ./modules/address.jsVue.use(Vuex)const store new Vuex.Store({modules: {address} })export default store 创建modules文件夹&#xff1a;modul…

c# 简单实现将Message的内容保存到txt中,超过100个则清理旧文件

using System; using System.IO; using System.Threading;public static class LogManager {private static readonly object _fileLock new object(); // 线程安全锁private const int MaxFiles 100; // 最大文件数限制private const string LogDire…

阿里云镜像加速仅支持阿里云产品了

最近在拉取docker镜像时一直报超时的错误&#xff1a; docker pull hello-world Using default tag: latest Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exce…

从零实现Git安装、使用

一、git安装 Git官方下载 1.下载exe程序 2.双击安装&#xff0c;一直点击next&#xff0c;默认安装 安装完成后&#xff0c;在任意文件夹右键&#xff0c;出现下图所示&#xff0c;即为安装成功。 3.【Git Bash Here】调出命令窗口&#xff0c;设置用户名和 email 地址。 gi…

生产环境中如何使用Caffeine+Redis实现二级缓存(详细分析了遇到的各种情况)

生产环境中如何使用CaffeineRedis实现二级缓存&#xff08;详细分析了各种情况&#xff09; 本篇主要讲解的是实现CaffeineRedis实现一个现成的使用流程。下一篇讲解什么是Caffeine以及caffeine的使用 00背景&#xff1a; 使用Caffeine和Redis的二级缓存方案源自于分布式系统…

RT-Thread开发文档合集

瑞萨VisionBoard开发实践指南 RT-Thread 文档中心 RT-Thread-【RA8D1-Vision Board】 RA8D1 Vision Board上的USB实践RT-Thread问答社区 - RT-Thread 【开发板】环境篇&#xff1a;05烧录工具介绍_哔哩哔哩_bilibili 【RA8D1-Vision Board】基于OpenMV 实现图像分类_哔哩哔哩_…

甘果桌面tv版下载-甘果桌面安卓电视版使用教程

甘果桌面 TV 版是一款备受关注的应用&#xff0c;它可以让安卓电视的界面更加个性化、操作更加便捷。接下来&#xff0c;我们就详细了解一下甘果桌面 TV 版的下载方法以及安卓电视版的使用教程。 甘果桌面 TV 版下载 打开你的安卓电视&#xff0c;找到并进入电视自带的应用商店…

RAII资源管理理解

基础介绍 RAII (Resource Acquisition Is Initialization) 是一种 C 编程范式&#xff0c;这不是一个语法特性&#xff0c;而是一种处理方式。RAII的思想&#xff1a; 资源获取与对象初始化同时发生资源释放与对象销毁同时发生通过对象的生命周期来管理资源&#xff0c;确保资…

解锁元生代:ComfyUI工作流与云原生后端的深度融合

目录 蓝耘元生代&#xff1a;智算新势力崛起​ ComfyUI 工作流创建详解​ ComfyUI 初印象​ 蓝耘平台上搭建 ComfyUI 工作流​ 构建基础工作流实操​ 代码示例与原理剖析​ 云原生后端技术全景 云原生后端概念解析​ 核心技术深度解读​ 蓝耘元生代中两者的紧密联系​…

实战篇|多总线网关搭建与量产验证(5000 字深度指南)

引言 1. 环境准备与硬件选型 1.1 项目需求分析 1.2 SoC 与开发板选型 1.3 物理接口与 PCB 设计 1.4 电源与供电保护 2. 软件架构与协议栈移植 2.1 分层架构详解 2.2 协议栈移植步骤 2.3 高可用驱动设计 2.4 映射逻辑与 API 定义 3. 开发流程与实践 3.1 敏捷迭代与里程碑 3.2 核…