日期:2014-05-16  浏览次数:20425 次

学习DB2中的锁---锁基础(原创)

锁的工作原理

我们知道DB2通过使用 把事务彼此隔离开来。锁是一种用来将数据资源与单个事务关联起来的机制,其用途是当某个资源与拥有它的事务关联在一起时,控制其他事务如何与该资源进行交互。(我们称与被锁定的资源关联的事务持有拥有 该锁。)DB2 数据库管理程序用锁来禁止事务访问其他事务写入的未提交数据(除非使用了未提交的读隔离级别),并禁止其他事务在拥有锁的事务使用限制性隔离级别时对这些 行进行更新。一旦获取了锁,在事务终止之前,就一直持有该锁;该事务终止时释放锁,其他事务就可以使用被解锁的数据资源了。

如果一个事务尝试访问数据资源的方式与另一个事务所持有的锁不兼容(稍后我们将研究锁兼容性),则该事务必须等待,直到拥有锁的事务终止为止。这被称为锁等待 事件。当锁等待事件发生时,尝试访问数据资源的事务所做的只是停止执行,直到拥有锁的事务终止和不兼容的锁被释放为止。

锁的属性

所有的锁都有下列基本属性:
object:object 属性标识要锁定的数据资源。DB2 数据库管理程序在需要时锁定数据资源(如表空间、表和行)。
size:size 属性指定要锁定的数据资源部分的物理大小。锁并不总是必须控制整个数据资源。例如,DB2 数据库管理程序可以让应用程序独占地控制表中的特定行,而不是让该应用程序独占地控制整个表。
duration:duration 属性指定持有锁的时间长度。事务的隔离级别通常控制着锁的持续时间。
mode:mode 属性指定允许锁的拥有者执行的访问类型,以及允许并发用户对被锁定数据资源执行的访问类型。这个属性通常称为锁状态。

锁状态

锁状态确定允许锁的拥有者执行的访问类型,以及允许并发用户对被锁定数据资源执行的访问类型。表 1 说明了可用的锁状态,按照控制递增的次序排列。
表 1. 锁状态?

锁状态(模式)适用对象描述
意向无(Intent None,IN) 表空间和表 锁的拥有者可以读取被锁定表中的数据(包括未提交数据),但不能更改这些数据。在这种模式中,锁的拥有者不获取行级锁;因此,其他并发应用程序可以读取和更改表中的数据。
意向共享(Intent Share,IS) 表空间和表 锁的拥有者可以读取被锁定表中的数据,但不能更改这些数据。同样,因为锁的拥有者不获取行级锁;所以,其 他并发的应用程序可以读取和更改表中的数据。(当事务拥有表上的意向共享锁时,就在它所读取的每个行上进行共享锁定。)当事务没有表达更新表中行的意图 时,就获取这种锁。(SELECT FOR UPDATE、UPDATE ... WHERE 和 INSERT 语句表达更新的意图。)
下一键共享(Next Key Share,NS) 锁拥有者和所有并发的事务都可以读(但不能更改)被锁定行中的数据。这种锁用来在使用读稳定性或游标稳定性事务隔离级别读取的数据上代替共享锁。
共享(Share,S) 表和行 锁 拥有者和任何其他并发的事务都可以读(但不能更改)被锁定的表或行中的数据。只要表不是使用共享锁锁定的,那么该表中的单个行可以使用共享锁锁定。但是, 如果表是用共享锁定的,则锁拥有者不能在该表中获取行级的共享锁。如果表或行是用共享锁锁定的,则其他并发事务可以读取数据,但不能对它进行更改。
意向互斥(Intent Exclusive,IX) 表空间和表 锁 拥有者和任何其他并发的应用程序都可以读取和更改被锁定表中的数据。当锁拥有者从表中读取数据时,它在所读取的每一行上获取一个共享锁,而在它更新的每一 行上获取更新锁和互斥锁。其他并发的应用程序可以读取和更新被锁定的表。当事务表达更新表中行的意图时,就获取这种锁。
带意向互斥的共享(Share With Intent Exclusive,SIX) 锁拥有者可以读取和更改被锁定表中的数据。锁拥有者在它更新的行上获取互斥锁,但不在它读取的行上获取锁;因此,其他并发的应用程序可以读取但不能更新被锁定表中的数据。
更新(Updat