SQL server 2005中的锁(1) Sql Server隔离级别(1)

在以前的一片随笔中,简单的说了一下SQL Server中的隔离级别。而SQL Server的隔离级别是经过锁的机制来实现的。如今深刻一下,谈谈SQL Server中的锁。html

开始以前,先要定义一下前提:sql

1.隔离级别的实现其实就是在不一样的资源上加锁。
2.对数据库的每一次访问(CRUD)咱们称其为一个事务(在begin tran,commit tran|rollback tran中的语句块,或者即席查询--单条SQL)。不一样的事务若是同时访问同一个数据库资源,会产生一系列的问题(见 Sql Server隔离级别(1) )。
3.大多数的事务在访问资源以前都会尝试对资源加上对应的锁(acquire lock,请求一个锁)。只有在Read Uncommitted隔离级别以及在表上加了WITH(No Lock) hint的Select语句不会请求锁。
3.读锁(共享锁S)不会阻塞读锁,读锁会阻塞写锁(独占锁X),写锁会阻塞读锁。
4.在一个事务中,只有在Repeatable Read或更高的隔离级别下,会将select语句的读锁一直保持到事务结束(提交或回滚),Read Committed隔离级别会形成不可重复读的缘由就是在事务中的select语句执行完成后(事务没有执行完)读锁就直接释放了。数据库

5.当前事务中的锁能够经过SELECT * FROM sys.dm_tran_locks 这个查询查看并发

====================================开始的分割线=========================================================post

Server中存在不一样粒度的锁:行锁,键锁,页锁,表锁等等,之因此要存在这些锁,是为了在并发性与系统开销间作一个平衡。粒度更小的锁将带了更好的并发性和更大的系统开销例如行锁的并发性好于表锁,不过系统的开销却大于表锁。性能

a.获取表锁时:整张表包括未被查询使用的行将会被锁住,其余试图请求表上不兼容锁的查询都将等待。此时系统中只须要维护一个表锁便可。ui

b.获取行锁时:只有查询使用到的行会被锁住,请求其余行的查询能够顺利的进行。此时并发性好于a,可是对于每个被使用的行系统都要维护一个锁,系统开销增长。url

一下是一些锁的资源,这里先大概了解下就好htm

资源blog

说明

RID

行标识,用于锁住整个表的其中一行

KEY

经过在索引来锁住行,用于在序列化的隔离级别中锁住一个行的范围。

PAGE

8kb大小的数据页或者索引页

EXTENT

一组连续的八页,例如数据页或索引页。

TABLE

包括全部数据和索引的整个表。

DATABASE

数据库。

 

 

 

 

 

 

 

 

 

 

 

 

在一个SQL执行的时候,或多或少都会请求上述的资源,而对这些资源的请求能够当作是对这些资源上的锁的请求。只有成功的请求到这些资源上的锁或者说成功的在当前的事务中对这些资源加锁,才能对这些资源进行CRUD的操做。

对于不一样的资源请求,SQL Server会应用不一样的锁模式来试图在资源上加锁。常常接触到的锁模式以下:

共享锁(S):
请求到共享锁(读锁)容许事务能够读取某一个资源,此时其余的事务将请求不到该资源的独占锁(写锁),可是能够请求到共享锁。在资源读取完成后,共享锁将会释放(即便此时事务尚未结束)。除非事务在read repeatable或者更高的隔离级别下执行,或者经过使用sql hint在事务执行时一直持有锁(例如WITH(HOLDLOCK)),共享锁将持续到事务结束。

更新锁(U):
更新锁的存在是为了不在并发环境下不一样事务的Update语句形成死锁。

一个典型的Update操做将通过如下两步:
步骤1.获取将要更新的资源的共享锁将数据读出
步骤2.将共享锁转换成独占锁并将更新的数据写入到资源中

考虑到并发环境,两个事务同时到达步骤1,获取到同一资源的共享锁(共享锁之间不会阻塞)。而后两个事务都开始将试图共享锁转换成独占锁,发现没法转换,由于此时两个事务同时还保留了对资源的共享锁,而共享锁是会阻塞独占锁的。两个事务都等待对方的共享锁释放,因而就产生了死锁。

上述的Update模式中,一个Update操做将再也不是原子操做,由于在步骤1到步骤2之间会被其余的事务影响。因此须要引入更新锁来替换步骤1中获取的共享锁,更新锁是互斥的,因此将不会出现两个Update操做同时获取到更新锁的状况。只多是一个事务获取到了更新锁,而另外一个事务只好等待更新锁的释放。

在Update用更新锁来替代共享锁来查找资源将防止并发更新产生死锁,而且因为更新锁能够和共享锁兼容,因此其余的事务依然能够在资源上放置共享锁。

 

独占锁(X)
独占锁阻塞其余的全部锁,没法读取或者修改加了独占锁的资源。

意向锁(IS,IX,SIX)一个意向锁代表Sql Server但愿获取当前资源的层次更低的共享锁或者独占锁。例如,表上的IS锁(意向共享锁)代表事务将要表中的页或者行(粒度比表更小的资源)上放置共享锁,而放置意向锁将避免随后的其余事务在表上获取到独占锁。意向锁可以提升性能,由于当一个事务要获取一个表的锁的时候不用再去检查表的资资源(页或行)是否被锁住了, 而只须要检查表上是否有意向锁就好了。

相关文章
相关标签/搜索