日期:2014-05-16 浏览次数:20716 次
sql server锁的机制
?
?
锁有两种分类方法。
(1) 从数据库系统的角度来看
锁分为以下三种类型:
? ? (2)从程序员的角度看
独
占锁锁定的资源只允许进行锁定操作的程序使用,其它任何对它的操作均不会被接受。执行数据更新命令,即INSERT、 UPDATE 或DELETE
命令时,SQL Server 会自动使用独占锁。但当对象上有其它锁存在时,无法对其加独占锁。独占锁一直到事务结束才能被释放。
共享锁锁定的资源可以被其它用户读取,但其它用户不能修改它。在SELECT 命令执行时,SQL Server 通常会对对象进行共享锁锁定。通常加共享锁的数据页被读取完毕后,共享锁就会立即被释放。
更
新锁是为了防止死锁而设立的。当SQL Server 准备更新数据时,它首先对数据对象作更新锁锁定,这样数据将不能被修改,但可以读取。等到SQL
Server 确定要进行更新数据操作时,它会自动将更新锁换为独占锁。但当对象上有其它锁存在时,无法对其作更新锁锁定。
锁分为以下两种类型:
悲
观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处
于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机
制,也无法保证外部系
统不会修改数据)。
相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。
而
乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本( Version
)记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version”
字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如
果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
???? sql server的所有活动都会产生锁。锁定的单元越小,就越能越能提高并发处理能力,但是管理锁的开销越大。如何找到平衡点,使并发性和性能都可接受是sql server的难点。
sql server有如下几种琐:
读是共享锁,写是排他锁,先读后更新的操作是更新锁,更新锁成功并且改变了数据时更新锁升级到排他锁。锁的类型有:
db-----数据库,由于 dbid 列已包含数据库的数据库 id,所以没有提供任何信息
fil----文件
idx----索引
pg-----页,数据或索引页。页码。页由 fileid:page 组合进行标识,其中,fileid 是 sysfiles 表中的 fileid,而 page 是该文件内的逻辑页码。
key----键,用于保护可串行事务中的键范围
tab----表,包括所有数据和索引在内的整个表。由于 objid 列已包含表的对象 id,所以没有提供任何信息
ext----区域, 相邻的八个数据页或索引页构成的一组。正被锁定的扩展盘区中的第一个页码。页由 fileid:page 组合进行标识
rid----行,表内已锁定行的行标识符。行由 fileid:page:rid 组合进行标识,其中,rid 是页中的行标识符。
细分锁的模式:
0 null 没有得到资源的访问权限
1 sch-s (schema stability) 对查询进行编译时。能防止加锁的对象被删除直到解锁
2 sch-m (schema modification) 改变数据库结构时发生。能防止其他的事务访问加锁的对象
3 is (intent shares) 意图共享锁。
4 siu(share intent update) 意图在维护资源的共享锁时,把更新锁放到锁层次结构的下层资源上
5 is-s(intent share-shared) 复合键范围锁
6 ix(intent exclusive) 意图排他锁
7 six(share intent exclusive)
8 s(share) 共享锁
9 u(update) 更新锁。防止死锁
10 iin-nul(intent insert-null) 索引行层次的锁定,复合键范围锁
11 is-x(intent share-exclusive)
12 iu(intent update) 意图更新锁
13 is-u(intent share update) 串行更新扫描
14 x(exclusive) 排他锁
15 bu 块操作使用的锁
所以有如下的结论。