封锁协议

 

在运用X锁和S锁对数据对象加锁时,还需要约定一些规则 ,例如何时申请X锁或S锁、持锁时间、何时释放等。称这些规则为封锁协议(Locking Protocol)。对封锁方式规定不同的规则,就形成了各种不同的封锁协议。

一、一级封锁协议

 一级封锁协议是:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。

 一级封锁协议可以防止丢失修改,并保证事务T是可恢复的。使用一级封锁协议可以解决丢失修改问题。

 在一级封锁协议中,如果仅仅是读数据不对其进行修改,是不需要加锁的,它不能保证可重复读和不读“脏”数据。

二、二级封锁协议

 二级封锁协议是:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后方可释放S锁。

 二级封锁协议除防止了丢失修改,还可以进一步防止读“脏”数据。但在二级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读。

三、三级封锁协议

 三级封锁协议是:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。

 三级封锁协议除防止了丢失修改和不读“脏”数据外,还进一步防止了不可重复读。

 上述三级协议的主要区别在于什么操作需要申请封锁,以及何时释放。

 

共享锁  
  共享   (S)   锁允许并发事务读取   (SELECT)   一个资源。资源上存在共享   (S)   锁时,任何其它事务都不能修改数据。一旦已经读取数据,便立即释放资源上的共享   (S)   锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享   (S)   锁。  
   
  更新锁  
  更新   (U)   锁可以防止通常形式的死锁。一般更新模式由一个事务组成,此事务读取记录,获取资源(页或行)的共享   (S)   锁,然后修改行,此操作要求锁转换为排它   (X)   锁。如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排它   (X)   锁。共享模式到排它锁的转换必须等待一段时间,因为一个事务的排它锁与其它事务的共享模式锁不兼容;发生锁等待。第二个事务试图获取排它   (X)   锁以进行更新。由于两个事务都要转换为排它   (X)   锁,并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。  
   
  若要避免这种潜在的死锁问题,请使用更新   (U)   锁。一次只有一个事务可以获得资源的更新   (U)   锁。如果事务修改资源,则更新   (U)   锁转换为排它   (X)   锁。否则,锁转换为共享锁。  
   
  排它锁  
  排它   (X)   锁可以防止并发事务对资源进行访问。其它事务不能读取或修改排它   (X)   锁锁定的数据。  
   
  意向锁  
  意向锁表示   SQL   Server   需要在层次结构中的某些底层资源上获取共享   (S)   锁或排它   (X)   锁。例如,放置在表级的共享意向锁表示事务打算在表中的页或行上放置共享   (S)   锁。在表级设置意向锁可防止另一个事务随后在包含那一页的表上获取排它   (X)   锁。意向锁可以提高性能,因为   SQL   Server   仅在表级检查意向锁来确定事务是否可以安全地获取该表上的锁。而无须检查表中的每行或每页上的锁以确定事务是否可以锁定整个表。  
   
  意向锁包括意向共享   (IS)、意向排它   (IX)   以及与意向排它共享   (SIX)。  
   
  锁模式   描述    
  意向共享   (IS)   通过在各资源上放置   S   锁,表明事务的意向是读取层次结构中的部分(而不是全部)底层资源。    
  意向排它   (IX)   通过在各资源上放置   X   锁,表明事务的意向是修改层次结构中的部分(而不是全部)底层资源。IX   是   IS   的超集。    
  与意向排它共享   (SIX)   通过在各资源上放置   IX   锁,表明事务的意向是读取层次结构中的全部底层资源并修改部分(而不是全部)底层资源。允许顶层资源上的并发   IS   锁。例如,表的   SIX   锁在表上放置一个   SIX   锁(允许并发   IS   锁),在当前所修改页上放置   IX   锁(在已修改行上放置   X   锁)。虽然每个资源在一段时间内只能有一个   SIX   锁,以防止其它事务对资源进行更新,但是其它事务可以通过获取表级的   IS   锁来读取层次结构中的底层资源。    
   
   
  架构锁  
  执行表的数据定义语言   (DDL)   操作(例如添加列或除去表)时使用架构修改   (Sch-M)   锁。  
   
  当编译查询时,使用架构稳定性   (Sch-S)   锁。架构稳定性   (Sch-S)   锁不阻塞任何事务锁,包括排它   (X)   锁。因此在编译查询时,其它事务(包括在表上有排它   (X)   锁的事务)都能继续运行。但不能在表上执行   DDL   操作。  
   
  大容量更新锁  
  当将数据大容量复制到表,且指定了   TABLOCK   提示或者使用   sp_tableoption   设置了   table   lock   on   bulk   表选项时,将使用大容量更新   (BU)   锁。大容量更新   (BU)   锁允许进程将数据并发地大容量复制到同一表,同时防止其它不进行大容量复制数据的进程访问该表。  
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值