聊一聊数据库中的锁
是我在数据库中添加了一个定时执行的小程序,每到周日,就自动运行如下的脚本Copydelete from 后宫佳丽 where age18一开始还自我感觉良好,后面我就发现不对了,每到周日,这个脚本一执行就是一整天,运行的时间有点长是小事,重点是这大好周日,我再想读这张表的数据,怎么也读不出来了,怎是一句空虚了得,我好难啊!为什么编不下去了,真实背景是公司中遇到的一张有海量数据表,每次一旦执行历史数据的清理,我们的程序就因为读不到这张表的数据,疯狂地报错,后面一查了解到,原来是因为定时删除的语句设计不合理,导致数据库中数据由行锁(Row lock)升级为表锁(Table lock)了.解决这个问题的过程中把数据库锁相关的学习了一下,这里把学习成果,分享给大家,希望对大家有所帮助.我将讨论SQL Server锁机制以及如何使用SQL Server标准动态管理视图监视SQL Server 中的锁,相信其他数据的锁也大同小异,具有一定参考意义.铺垫知识在我开始解释SQL Server锁定体系结构之前让我们花点时间来描述ACID原子性一致性隔离性和持久性是什么。ACID是指数据库管理系统DBMS在写入或更新资料的过程中为保证事务transaction是正确可靠的所必须具备的四个特性原子性atomicity或称不可分割性、一致性consistency、隔离性isolation又称独立性、持久性durability。ACID#原子性(Atomicity)#一个事务transaction中的所有操作或者全部完成或者全部不完成不会结束在中间某个环节。事务在执行过程中发生错误会被回滚Rollback到事务开始前的状态就像这个事务从来没有执行过一样。即事务不可分割、不可约简。一致性(Consistency)#在事务开始之前和事务结束以后数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。隔离性(Isolation)#数据库允许多个并发事务同时对其数据进行读写和修改的能力隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别包括未提交读Read uncommitted、提交读read committed、可重复读repeatable read和串行化Serializable。持久性(Durability)#事务处理结束后对数据的修改就是永久的即便系统故障也不会丢失。来源:维基百科 https://zh.wikipedia.org/wiki/ACID事务 (Transaction:)#事务是进程中最小的堆栈不能分成更小的部分。此外某些事务处理组可以按顺序执行但正如我们在原子性原则中所解释的那样即使其中一个事务失败所有事务块也将失败。锁定 (Lock)#锁定是一种确保数据一致性的机制。SQL Server在事务启动时锁定对象。事务完成后SQL Server将释放锁定的对象。可以根据SQL Server进程类型和隔离级别更改此锁定模式。这些锁定模式是锁定层次结构#SQL Server具有锁定层次结构用于获取此层次结构中的锁定对象。数据库位于层次结构的顶部行位于底部。下图说明了SQL Server的锁层次结构。共享S锁 (Shared (S) Locks)#当需要读取对象时会发生此锁定类型。这种锁定类型不会造成太大问题。独占X锁定 (Exclusive (X) Locks)#发生此锁定类型时会发生以防止其他事务修改或访问锁定对象。更新U锁 (Update (U) Locks)#此锁类型与独占锁类似但它有一些差异。我们可以将更新操作划分为不同的阶段读取阶段和写入阶段。在读取阶段SQL Server不希望其他事务有权访问此对象以进行更改,因此SQL Server使用更新锁。意图锁定 (Intent Locks)#当SQL Server想要在锁定层次结构中较低的某些资源上获取共享S锁定或独占X锁定时会发生意图锁定。实际上当SQL Server获取页面或行上的锁时表中需要设置意图锁。SQL Server locking了解了这些背景知识后我们尝试再SQL Server找到这些锁。SQL Server提供了许多动态管理视图来访问指标。要识别SQL Server锁我们可以使用sys.dm_tran_locks视图。在此视图中我们可以找到有关当前活动锁管理的大量信息。在第一个示例中我们将创建一个不包含任何索引的演示表并尝试更新此演示表。CopyCREATE TABLE TestBlock (Id INT , Nm VARCHAR(100)) INSERT INTO TestBlock values(1,CodingSight) In this step, we will create an open transaction and analyze the locked resources. BEGIN TRAN UPDATE TestBlock SET NmNewValue_CodingSight where Id1 select SPID再获取到了SPID后我们来看看sys.dm_tran_lock视图里有什么。Copyselect * from sys.dm_tran_locks WHERE request_session_id74此视图返回有关活动锁资源的大量信息,但是是一些我们难以理解的一些数据。因此我们必须将sys.dm_tran_locksjoin 一些其他表。CopySELECT dm_tran_locks.request_session_id, dm_tran_locks.resource_database_id, DB_NAME(dm_tran_locks.resource_database_id) AS dbname, CASE WHEN resource_type OBJECT THEN OBJECT_NAME(dm_tran_locks.resource_associated_entity_id) ELSE OBJECT_NAME(partitions.OBJECT_ID) END AS ObjectName, partitions.index_id, indexes.name AS index_name, dm_tran_locks.resource_type, dm_tran_locks.resource_description, dm_tran_locks.resource_associated_entity_id, dm_tran_locks.request_mode, dm_tran_locks.request_status FROM sys.dm_tran_locks LEFT JOIN sys.partitions ON partitions.hobt_id dm_tran_locks.resource_associated_entity_id LEFT JOIN sys.indexes ON indexes.OBJECT_ID partitions.OBJECT_ID AND indexes.index_id partitions.index_id WHERE resource_associated_entity_id 0 AND resource_database_id DB_ID() and request_session_id74 ORDER BY request_session_id, resource_associated_entity_id在上图中您可以看到锁定的资源。SQL Server获取该行中的独占锁。RID用于锁定堆中单个行的行标识符同时SQL Server获取页中的独占锁和TestBlock表意向锁。这意味着在SQL Server释放锁之前任何其他进程都无法读取此资源,这是SQL Server中的基本锁定机制。现在我们将在测试表上填充一些合成数据。CopyTRUNCATE TABLE TestBlock DECLARE K AS INT0 WHILE K 8000 BEGIN INSERT TestBlock VALUES(K, CAST(K AS varchar(10)) Value ) SET KK1 END --After completing this step, we will run two queries and check the sys.dm_tran_locks view. BEGIN TRAN UPDATE TestBlock set Nm New_Value where Id5000

相关新闻

终极RSA攻击工具RsaCtfTool:从零开始掌握密码学实战

终极RSA攻击工具RsaCtfTool:从零开始掌握密码学实战

终极RSA攻击工具RsaCtfTool:从零开始掌握密码学实战 【免费下载链接】RsaCtfTool RSA attack tool (mainly for ctf) - retrieve private key from weak public key and/or uncipher data 项目地址: https://gitcode.com/gh_mirrors/rs/RsaCtfTool RSA攻击工…

2026/7/3 2:38:51阅读更多 →
智谱数开一面:GraphRAG用过吗?和RAG到底有什么区别?

智谱数开一面:GraphRAG用过吗?和RAG到底有什么区别?

前言 最近在准备跳槽,面了几家 AI 数据开发相关岗位,其中智谱一面遇到了一道让我印象很深的问题: GraphRAG 用过吗?和传统 RAG 有什么区别? 这似乎是一道很基础的概念题,但真正回答起来才发现,…

2026/7/3 2:38:51阅读更多 →
Django连接MySQL配置与性能优化实战

Django连接MySQL配置与性能优化实战

1. Django与MySQL连接基础解析 作为Python生态中最流行的Web框架,Django默认使用SQLite作为开发数据库,但在生产环境中MySQL才是更常见的选择。最近在重构一个电商项目时,我再次经历了完整的Django-MySQL配置流程,发现很多新手容易…

2026/7/3 2:38:51阅读更多 →
ChatGPT做PPT内容的黑箱真相:我们逆向拆解OpenAI官方提示链,还原高通过率大纲的7层嵌套指令结构

ChatGPT做PPT内容的黑箱真相:我们逆向拆解OpenAI官方提示链,还原高通过率大纲的7层嵌套指令结构

更多请点击: https://codechina.net 第一章:ChatGPT生成PPT大纲的底层认知盲区 多数用户将ChatGPT视为“智能提纲生成器”,却忽视其本质是概率驱动的语言补全系统——它不理解演示逻辑、受众认知负荷或视觉叙事节奏,仅基于训练语…

2026/7/3 3:58:55阅读更多 →
IPD咨询洞察:矩阵组织总变成“扯皮阵“,华为如何经历这个过程?

IPD咨询洞察:矩阵组织总变成“扯皮阵“,华为如何经历这个过程?

很多企业一遇到跨部门协同问题,第一反应就是上矩阵组织。架构图画出来了,人员配齐了,权责也划分了,但落地之后,问题反而更多:多头指挥、责任不清、协同更慢、效率更低。矩阵变成了"扯皮阵"&#…

2026/7/3 3:58:55阅读更多 →
深入浅出:基于 RPA 技术的企业微信第三方接口是如何工作的?

深入浅出:基于 RPA 技术的企业微信第三方接口是如何工作的?

在开发企业微信相关的自动化工具时,我们经常会遇到“官方 API 权限不够”的尴尬。这时候,市面上基于 RPA(机器人流程自动化)的第三方接口(如非官方接口)往往会成为工程师们的“公开秘密”。很多同学会好奇&…

2026/7/3 3:58:55阅读更多 →
深度剖析 RFID 仓储管理标签产业链:行业趋势与发展现状

深度剖析 RFID 仓储管理标签产业链:行业趋势与发展现状

深度剖析 RFID 仓储管理标签产业链:行业趋势与发展现状在当今数字化物流时代,仓储管理的高效性和精准性成为企业竞争的关键。传统的仓储管理方式在数据采集、库存盘点等方面效率低下,容易出现人为错误,而 RFID 仓储管理标签的出现…

2026/7/3 3:58:55阅读更多 →
嵌入式系统 VHDL 入门笔记:从语法到状态机

嵌入式系统 VHDL 入门笔记:从语法到状态机

一、VHDL 是什么?底层原理与语言基础 1.1 VHDL 的定位 VHDL(VHSIC Hardware Description Language)是一种硬件描述语言(HDL),用于描述数字电路的结构与行为。它不是传统意义上的编程语言——你写的 VHDL …

2026/7/3 3:58:55阅读更多 →
2026年用AI推进Python实现,先验证小流程再扩功能

2026年用AI推进Python实现,先验证小流程再扩功能

已有量化经验者常常不缺想法,缺的是把想法稳妥地变成 Python 实现的路径。AI 可以加速这个过程,但如果一上来就追求复杂功能,读者可能会失去对代码和逻辑的控制。流程完整才方便复查一个量化想法进入开发时,通常包含很多隐含判断和…

2026/7/3 3:53:55阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/2 12:10:34阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/7/2 12:10:34阅读更多 →
LV3296与PIC18F45K22的UART通信与USB扩展方案

LV3296与PIC18F45K22的UART通信与USB扩展方案

1. LV3296与PIC18F45K22的硬件搭档解析在嵌入式数据采集系统中,LV3296条形码扫描模块与PIC18F45K22微控制器的组合堪称经典搭配。LV3296作为一款工业级条码扫描头,其核心是一颗高性能CMOS图像传感器,配合专用解码芯片,能自动识别包…

2026/7/3 0:03:41阅读更多 →
AI初创生存指南:6个月完成可信度验证闭环

AI初创生存指南:6个月完成可信度验证闭环

1. 这不是“逆袭指南”,而是一份AI初创公司真实生存手记“How To Beat Odds As an AI Startup?”——这个标题乍看像一句热血口号,但在我带过7个从0到1的AI产品团队、亲手踩过融资失败、技术债崩盘、客户POC卡在最后一公里等23类典型坑之后,…

2026/7/3 0:03:41阅读更多 →
多模态+推理链+RAG 2.0+智能体:工业级AI系统落地四支柱

多模态+推理链+RAG 2.0+智能体:工业级AI系统落地四支柱

1. 这不是又一篇“AI趋势速览”,而是一份实操者手记:当多模态、推理链、检索增强与智能体协作真正撞进工程现场“LAI #73”这个编号本身就像一个暗号——它不属于某家大厂的白皮书,也不是学术会议的议程表,而是长期泡在模型训练集…

2026/7/3 0:03:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/3 1:12:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/3 1:36:36阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/3 2:08:15阅读更多 →