SQLserver锁的机制

来源:互联网 发布:php处理ajax跨域 编辑:程序博客网 时间:2024/05/08 19:51
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

SQLserver锁的机制

SQLserver的所有活动都会产生锁。锁定的单元越小,就越能越能提高并发处理能力,但是管理锁的开销越大。如何找到平衡点,使并发性和性能都可接受是的难点。
SQLserver有如下几种琐:
1、共享锁
用于只读操作(SELECT),锁定共享的资源。共享锁不会阻止其他用户读,但是阻止其他的用户写和修改。
2、更新锁
更新锁是一种意图锁,当一个事物已经请求共享琐后并试图请求一个独占锁的时候发生更新琐。例如当两个事物在几行数据行上都使用了共享锁,并同时试图获取独占锁以执行更新操作时,就发生了死锁:都在等待对方释放共享锁而实现独占锁。更新锁的目的是只让一个事物获得更新锁,防止这种情况的发生。
3、独占锁
一次只能有一个独占锁用在一个资源上,并且阻止其他所有的锁包括共享缩。写是独占锁,可以有效的防止’脏读’
4、意图缩
在使用共享锁和独占锁之前,使用意图锁。从表的层次上查看意图锁,以判断事物能否获得共享锁和独占锁,提高了系统的性能,不需从爷或者行上检查。
5、计划锁
Sch-M,Sch-S。对结构改变时用Sch-M,对查询进行编译时用Sch-S。这两种锁不会阻塞任何事物锁,包括独占锁。

读是共享锁,写是排他锁,先读后更新的操作是更新锁,更新锁成功并且改变了数据时更新锁升级到排他锁。锁的类型有:
DB-----数据库,由于dbid列已包含数据库的数据库ID,所以没有提供任何信息
FIL----文件
IDX----索引
PG-----页,数据或索引页。页码。页由fileid:page组合进行标识,其中,fileid是sysfiles表中的fileid,而page是该文件内的逻辑页码。
KEY----键,用于保护可串行事务中的键范围
TAB----表,包括所有数据和索引在内的整个表。由于ObjId列已包含表的对象ID,所以没有提供任何信息
EXT----区域,相邻的八个数据页或索引页构成的一组。正被锁定的扩展盘区中的第一个页码。页由fileid:page组合进行标识
RID----行,表内已锁定行的行标识符。行由fileid:page:rid组合进行标识,其中,rid是页中的行标识符

锁的状态:
Grant---能使用被授权的资源
Wait----能使用被其他任务阻塞的资源
Cnvrt---Convert,锁正在被转换

细分锁的模式:
0Null没有得到资源的访问权限
1Sch-S(Schemastability)对查询进行编译时。能防止加锁的对象被删除直到解锁
2Sch-M(SchemaModification)改变数据库结构时发生。能防止其他的事物访问加锁的对象
3IS(IntentShares)意图共享锁。
4SIU(ShareIntentUpdate)意图在维护资源的共享锁时,把更新锁放到锁层次结构的下层资源上
5IS-S(IntentShare-shared)复合键范围锁
6IX(IntentExclusive)意图排他锁
7SIX(ShareIntentExclusive)
8S(Share)共享锁
9U(Update)更新锁。防止死锁
10Iin-Nul(IntentInsert-Null)索引行层次的锁定,复合键范围锁
11IS-X(IntentShare-Exclusive)
12IU(IntentUpdate)意图更新锁
13IS-U(IntentShareUpdate)串行更新扫描
14X(Exclusive)排他锁
15BU块操作使用的锁

所以有如下的结论。

1、一个连接在修改数据块时别的连接不能修改这个数据块,直到解锁。
并行访问是任何数据库解决方案都最为重视的问题了,为了解决并行访问方面的问题各类数据库系统提出了各种各样的方案。SQLserver采用了多线程机制,它当然能够一次处理多个请求。不过,在用户修改数据的情况下并行访问问题就变得复杂起来了。显然,数据库通常只允许唯一用户一次修改特定的数据。当某一用户开始修改某块数据时,SQLserver能很快地锁定数据,阻止其他用户对这块数据进行更新,直到修改该数据的第一位用户完成其操作并提交交易或者回滚。但是,当某一位用户正在修改某块数据时假设另一位用户又正想查询该数据的信息时会发生什么情况呢?1

<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>