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对并发的处理-乐观锁和悲观锁
https://www.cnblogs.com/dengshaojun/p/3955826.html sql server对并发的处理-乐观锁和悲观锁 假如两个线程同时修改数据库同一条记录,就会导致后 ...
- 在SQL Server里为什么我们需要更新锁
今天我想讲解一个特别的问题,在我每次讲解SQL Server里的锁和阻塞(Locking & Blocking)都会碰到的问题:在SQL Server里,为什么我们需要更新锁?在我们讲解具体需 ...
- SQL SERVER错误:已超过了锁请求超时时段。
问题:远程连接数据库,无法打开视图,报错:SQL SERVER错误:已超过了锁请求超时时段. (Microsoft SQL Server,错误: 1222) 执行语句获取进程id select * f ...
- 通过DBCC Page查看在SQL Server中哪行数据被锁住了?
原文:通过DBCC Page查看在SQL Server中哪行数据被锁住了? 如何查看被锁的是哪行数据?通过dbcc page可以. 要想明白这个问题: 首先,需要模拟阻塞问题,这里直接模拟了阻塞问题的 ...
- 二、多线程基础-乐观锁_悲观锁_重入锁_读写锁_CAS无锁机制_自旋锁
1.10乐观锁_悲观锁_重入锁_读写锁_CAS无锁机制_自旋锁1)乐观锁:就像它的名字一样,对于并发间操作产生的线程安全问题持乐观状态,乐观锁认为竞争不总是会发生,因此它不需要持有锁,将 比较-设置 ...
- Sql Server来龙去脉系列之二 框架和配置
本节主要讲维持数据的元数据,以及数据库框架结构.内存管理.系统配置等.这些技术点在我们使用数据库时很少接触到,但如果要深入学习Sql Server这一章节也是不得不看.本人能力有限不能把所有核心的知识 ...
- 再谈mysql锁机制及原理—锁的诠释
加锁是实现数据库并发控制的一个非常重要的技术.当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁.加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更 ...
- (转)SQL SERVER的锁机制(二)——概述(锁的兼容性与可以锁定的资源)
二.完整的锁兼容性矩阵(见下图) 对上图的是代码说明:见下图. 三.下表列出了数据库引擎可以锁定的资源. 名称 资源 缩写 编码 呈现锁定时,描述该资源的方式 说明 数据行 RID RID 9 文件编 ...
- SQL SERVER错误:已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)
在SSMS(Microsoft SQL Server Management Studio)里面,查看数据库对应的表的时候,会遇到"Lock Request time out period e ...
随机推荐
- BIO,NIO,AIO(NIO2)的理解
写在前面,这里所说的IO主要是强调的网络IO 1.BIO(同步并阻塞) 客户端一个请求对应一个线程.客户端上来一个请求(最开始的连接以及后续的IO请求),服务端新建一个线程去处理这个请求,由于线程总数 ...
- Python编程笔记(第三篇)【补充】三元运算、文件处理、检测文件编码、递归、斐波那契数列、名称空间、作用域、生成器
一.三元运算 三元运算又称三目运算,是对简单的条件语句的简写,如: 简单条件处理: if 条件成立: val = 1 else: val = 2 改成三元运算 val = 1 if 条件成立 else ...
- sqlserver sql 循环
通过临时表进行sql循环 -----------创建临时表-------------- SELECT * INTO #tempfensitocity FROM( SELECT * FROM dbo.S ...
- 安装ubuntu16.04的时候出现的detecting file system
解决问题方法是,进入主界面执行,如下操作即可: sudo umount -l /isodevice
- Java学习笔记:知识总结
概述 1991年由sun公司开发的名称为Oak的语言,1994年更名为Java. JDK:Java Development Kit,Java的开发和运行环境,Java的开发工具和JRE. JRE:Ja ...
- spring 学习 一 spring 介绍
Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架. Spring ...
- setInterval与setTimeout 的区别
setInterval在执行完一次代码之后,经过了那个固定的时间间隔,它还会自动重复执行代码,而setTimeout只执行一次那段代码 用法: setInterval("alert( ...
- 强连通缩点— HDU1827
强连通缩点以后最终形成的是一棵树 我们可以根据树的性质来看缩点以后的强连通分量图,就很好理解了 /* gyt Live up to every day */ #include<cstdio> ...
- git版本控制工具的使用(1)。
为了使用. 感谢:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 讲解的很清晰, ...
- hadoop报错:java.io.IOException(java.net.ConnectException: Call From xxx/xxx to xxx:10020 failed on connection exception: java.net.ConnectException: 拒绝连接
任务一直报错 现象比较奇怪,部分任务可以正常跑,部分问题报错 报错信息如下: Ended Job = job_1527476268558_132947 with exception 'java.io. ...