接上SQL SERVER的锁机制(一)——概述(锁的种类与范围)
二、完整的锁兼容性矩阵(见下图)

对上图的是代码说明:见下图。

三、下表列出了数据库引擎可以锁定的资源。
| 
 名称  | 
 资源  | 
 缩写  | 
 编码  | 
 呈现锁定时,描述该资源的方式  | 
 说明  | 
| 
 数据行  | 
 RID  | 
 RID  | 
 9  | 
 文件编号:分页编号:Slot编号  | 
 用于锁定堆中的单个行的行标识符。  | 
| 
 索引键  | 
 KEY  | 
 KEY  | 
 7  | 
 6字节哈希值  | 
 索引中用于保护可序列化事务中的键范围的行锁。  | 
| 
 分页  | 
 PAGE  | 
 PAG  | 
 6  | 
 文件编号:分页编号  | 
 数据库中的 8 KB 页,例如数据页或索引页。  | 
| 
 范围  | 
 EXTENT  | 
 EXT  | 
 8  | 
 文件编号:范围的第一个分页的编号  | 
 一组连续的八页,例如数据页或索引页。  | 
| 
 HoBT  | 
 堆或 B 树。 用于保护没有聚集索引的表中的 B 树(索引)或堆数据页的锁。  | 
||||
| 
 数据表  | 
 TABLE  | 
 TAB  | 
 5  | 
 数据表ID(OBJID字段)  | 
 包括所有数据和索引的整个表。  | 
| 
 文件  | 
 FILE  | 
 FIL  | 
 3  | 
 文件编号  | 
 数据库文件。  | 
| 
 应用程序  | 
 APPLICATION  | 
 APP  | 
 10  | 
 6字节哈希值  | 
 应用程序专用的资源。  | 
| 
 METADATA  | 
 元数据锁。  | 
||||
| 
 ALLOCATION_UNIT  | 
 分配单元。  | 
||||
| 
 数据库  | 
 DATABASE  | 
 DB  | 
 2  | 
 数据库代码(DBID字段)  | 
 整个数据库。  | 
| 
 索引  | 
 IDX  | 
 4  | 
 Db_id:object_id:index_id相关的其他资源  | 
 索引中的数据行锁定,  | 
四、SQL SERVER要锁定资源时,默认是从最底级开始锁起,例如,索引键值,数据行,以避免大范围锁定,以避免影响其他人同时访问该范围内的其他数据,但是当内存不足时,SQL SERVER会自动扩大锁定范围以减低管理锁定的负荷。下面我们来看一个示例。

--建立SP_LOCK输出缓存表
if exists( select * from tempdb..sysobjects where name like '#temp%' and type ='u')
begin
drop table #temp
create table #temp(spid int,dbid int ,objid int,indid int,type varchar(3),resource varchar(20)
,mode varchar(20),status varchar(5))
end
begin tran
update WBK_PDE_head set [COP_EMS_NO]='abcde' where wbook_no='BE404942850177'
insert #temp exec sp_lock @@spid
commit tran
-----获取dbid
--select DB_ID('Test')
--只查看定制的数据库的相关资源,sql 2008
select spid,数据库=DB_NAME(dbid),对象=OBJECT_NAME(objid),
索引=(select name from sysindexes where ID=OBJID and indid=t.indid ),
TYPE,resource,mode,status from #temp t where dbid=28
order by dbid,objid,indid
---
---以SQL 2005的sys.indexes表查询相关数据
select spid,数据库=DB_NAME(dbid),对象=OBJECT_NAME(objid),
索引=(select name from sys.indexes where object_id=OBJID and index_id=t.indid ),
TYPE,resource,mode,status from #temp t where dbid=28
order by dbid,objid,indid

说明:
1.建立临时表#Temp用以存储系统存储过程sp_lock输出的数据
2.开启事务,然后更新数据(update),但不去确认事务,数据库会锁定相关对象,将sp_lock所呈现的相关数据插入到#Temp表中,并将结果查询出来。
在查询分析器中执行以下代码
select a.*,b.name from #temp a left join sysobjects b on a.objid=b.id order by a.type
图如下示:

另外的示例可以参见SQL SERVER的锁机制(一)——概述(锁的种类与范围)中的“示例代码二”相内容。
接上SQL SERVER的锁机制(一)——概述(锁的种类与范围)的更多相关文章
- 在SQL Server里为什么我们需要更新锁
		
今天我想讲解一个特别的问题,在我每次讲解SQL Server里的锁和阻塞(Locking & Blocking)都会碰到的问题:在SQL Server里,为什么我们需要更新锁?在我们讲解具体需 ...
 - sql server对并发的处理-乐观锁和悲观锁
		
https://www.cnblogs.com/dengshaojun/p/3955826.html sql server对并发的处理-乐观锁和悲观锁 假如两个线程同时修改数据库同一条记录,就会导致后 ...
 - SQL SERVER错误:已超过了锁请求超时时段。
		
问题:远程连接数据库,无法打开视图,报错:SQL SERVER错误:已超过了锁请求超时时段. (Microsoft SQL Server,错误: 1222) 执行语句获取进程id select * f ...
 - 通过DBCC Page查看在SQL Server中哪行数据被锁住了?
		
原文:通过DBCC Page查看在SQL Server中哪行数据被锁住了? 如何查看被锁的是哪行数据?通过dbcc page可以. 要想明白这个问题: 首先,需要模拟阻塞问题,这里直接模拟了阻塞问题的 ...
 - 偶然发现有的IIS里的程序,连接 不上SQL Server数据库, 超时
		
经查应用程序池中, 有一个启用32位应用程序, 有时打开它就能连接上SQL SERVER了.
 - 再谈mysql锁机制及原理—锁的诠释
		
加锁是实现数据库并发控制的一个非常重要的技术.当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁.加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更 ...
 - 二、多线程基础-乐观锁_悲观锁_重入锁_读写锁_CAS无锁机制_自旋锁
		
1.10乐观锁_悲观锁_重入锁_读写锁_CAS无锁机制_自旋锁1)乐观锁:就像它的名字一样,对于并发间操作产生的线程安全问题持乐观状态,乐观锁认为竞争不总是会发生,因此它不需要持有锁,将 比较-设置 ...
 - sql server对并发的处理-乐观锁和悲观锁(转)
		
假如两个线程同时修改数据库同一条记录,就会导致后一条记录覆盖前一条,从而引发一些问题. 例如: 一个售票系统有一个余票数,客户端每调用一次出票方法,余票数就减一. 情景: 总共300张票,假设两个售票 ...
 - SQL SERVER错误:已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)
		
在SSMS(Microsoft SQL Server Management Studio)里面,查看数据库对应的表的时候,会遇到"Lock Request time out period e ...
 
随机推荐
- Spark启动流程(Standalone)-分析
			
1.start-all.sh脚本,实际上执行java -cp Master 和 java -cp Worker 2.Master 启动时首先穿件一个RpcEnv对象,负责管理所有通信逻辑 3.Mast ...
 - IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass(); 时,报COMException
			
解决办法: 在Program.cs的Main函数中添加如下代码: ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Desktop);
 - MAC设置环境变量
			
1. Mac 启动加载文件位置(可设置环境变量) ------------------------------------------------------- (1)首先要知道你使用的Mac OS ...
 - 202-基于TI DSP TMS320C6678、Xilinx K7 FPGA XC7K325T的高速数据处理核心板
			
该DSP+FPGA高速信号采集处理板由我公司自主研发,包含一片TI DSP TMS320C6678和一片Xilinx FPGA K7 XC72K325T-1ffg900.包含1个千兆网口,1个FMC ...
 - python面向对象--类的装饰器
			
# def deco(obj): # print("=====",obj) # obj.x=1 # return obj # @deco#===> test = deco(t ...
 - 合肥学院ACM集训队第一届暑假友谊赛  B	FYZ的求婚之旅  D	计算机科学家 F	智慧码	  题解
			
比赛网址:https://ac.nowcoder.com/acm/contest/994#question B FYZ的求婚之旅 思路: 然后用快速幂即可. 细节见代码: #include <i ...
 - JavaScript设计模式 样例三 —— 装饰模式
			
装饰模式(Decorator Pattern): 定义:在不改变原对象的情况下,动态的给对象添加一些额外的职责.就功能而言,装饰模式相比生成子类更为灵活. 目的:把类的核心职责和装饰功能区分开.可以去 ...
 - overflow:hidden失效问题
			
2018-08-03 Questions about work 这几天开发的时候遇到了个问题,如图1. 写了个demo demo 地址 由于页面并没有进行整体缩放,导致在小屏幕手机上显示会有异常.PM ...
 - expect实现远程主机自动执行命令脚本
			
2014年第一个脚本,哈哈!!! expect实现远程主机自动执行命令脚本: #!/usr/bin/expect -- if { [llength $argv] < 4 } { puts &qu ...
 - java多线程sleep,wait,yield方法区别
			
sleep() 方法sleep()的作用是在指定的毫秒数内让当前“正在执行的线程”休眠(暂停执行).这个“正在执行的线程”是指this.currentThread()返回的线程.sleep方法有两个重 ...