意向锁
给一个节点加意向锁,意味着该节点下层节点正在被加锁;对任一节点加锁时,必须先对它的上层节点加意向锁。于是事务T要对表R1加X锁时,系统只要检查根节点数据库和表R1是否已加了不相容的锁,而不再需要搜索和检查R1中的每一个记录是否加了X锁。
下面介绍三种常用的意向锁:意向共享锁(Intent Share Lock,简称IS锁);意向排他锁(Intent Exclusive Lock,IX);共享意向排他锁(Share Intent Exclusive Lock,SIX)
1. IS锁
如果对一个数据对象加IS锁,表示它的后裔节点拟加S锁。例如,要对某个记录加S锁,则要首先对表和数据库加IS锁。
2. IX锁
如果对一个数据对象加IX锁,表示它的后裔节点拟加X锁。例如,要对某个记录加X锁,则要首先对表和数据库加IX锁。
3. SIX锁
如果对一个数据对象加SIX锁,表示对它加S锁,再加IX锁,即SIX=S+IX。例如,对某个表加SIX锁,则表示该事务要读整个表(所以要加S锁),同时会更新个别记录(所以要对该表加IX锁)。
兼容性
S X IS IX SIX -
S Y N Y N N Y
X N Y Y N N Y
IS Y N Y Y Y Y
IX N N Y Y N Y
SIX N N Y N N Y
- Y Y Y Y Y Y
锁状态:锁的类型
锁状态确定了对锁的所有者允许的访问类型,以及对锁定数据资源的并发用户许可的访问类型。下面的列表说明了可用的锁状态,按照递增控制排序:
锁状态(模式): 意向无(Intent None,IN)
适用对象: 表空间和表
描述: 锁的拥有者可以读取锁定表中的数据(包括未提交数据),但不能更改这些数据。在这种模式中,锁的拥有者不获取行级别的锁;因此,其它并发应用程序可以读取和更改表中的数据。
锁状态(模式): 意向共享(Intent Share,IS)
适用对象:表空间和表
描述: 锁的拥有者可以读取锁定表中的数据,但不能更改这些数据。同样,因为锁的拥有者不获取行级别锁;所以,其它并发的应用程序仍可以读取和更改表中的数据。(当事务拥有表上的意向共享锁时,就在它所读取的每个行上进行共享锁定。)当事务不传达更新表中行的意图时,就获取这种锁。
锁状态(模式): 下一键共享(Next Key Share,NS)
适用对象: 行
描述: 锁拥有者和所有并发的事务都可以读(但不能更改)锁定行中的数据。这种锁用来在使用“读稳定性”或“游标稳定性”事务隔离级别读取的数据上代替共享锁。
锁状态(模式): 共享(S)
适用对象: 表和行
描述: 锁拥有者和任何其它并发的事务都可以读(但不能更改)锁定的表或行中的数据。只要表不是使用共享锁锁定的,那么该表中的单个行可以使用共享锁锁定。但是,如果表是用共享锁定的,则锁拥有者不能在该表中获取行级别的共享锁。如果表或行是用共享锁锁定的,则其它并发事务可以读取数据,但不能对它进行更改。
锁状态(模式):意向互斥(Intent Exclusive,IX)
适用对象: 表空间和表
描述: 锁拥有者和任何其它并发的应用程序都可以读取和更改被锁定表中的数据。当锁拥有者从表读取数据时,它在所读取的每一行上获取一个共享锁,而在它更新的每一行上获取更新和互斥锁。其它并发的应用程序可以读取和更新锁定的表。当事务传达更新表中行的意图时,就获取这种锁。(SELECT FOR UPDATE、UPDATE ... WHERE和INSERT语句传达更新的意图。)
锁状态(模式):带意向互斥的共享(Share With Intent Exclusive,SIX)
适用对象: 表
描述: 锁拥有者可以读取和更改被锁定表中的数据。锁拥有者在它更新的行上获取互斥锁,但不获取它读取的行上的锁;因此,其它并发的应用程序可以读取但不能更新被锁定表中的数据。
锁状态(模式):更新(Update,U)
适用对象: 表和行
描述: 锁的拥有者可以更新被锁定表中的数据,并且锁的拥有者在它所更新的任何行上自动获得互斥锁。其它并发的应用程序可以但不能更新被锁定表中的数据。
锁状态(模式):下一键互斥(Next Key Exclusive,NX)
适用对象: 行
描述: 锁的拥有者可以读取但不能更新被锁定的行。当在表的索引中插入或删除行时,表中的下一行上将获得这种锁。
锁状态(模式):下一键弱互斥(Next Key Weak Exclusive,NW)
适用对象:行
描述:锁的拥有者可以读取但不能更新被锁定的行。当向非目录表的索引插入行时,表中下一行上就获得这种锁。
锁状态(模式):互斥(Exclusive,X)
适用对象: 表和行
描述: 锁的拥有者可以读取和更改被锁定的表或行中的数据。如果获取了互斥锁,则只允许使用“未提交的读”隔离级别的应用程序访问被锁定的表或行(多行)。对于用INSERT、UPDATE和/或DELETE语句操作的数据资源,将获取互斥锁。
锁状态(模式):弱互斥(Weak Exclusive,WE)
适用对象:行
描述: 锁的拥有者可以读取和更改被锁定的行。当向非目录表中插入行时,该行上将获得这种锁。
锁状态(模式): 超级互斥(Super Exclusive,Z)
适用对象: 表空间和表
描述:锁的拥有者可以更改表、删除表、创建索引或删除索引。当事务尝试执行上述任何一种操作时,表上就自动获得这种锁。在除去这个锁之前,不允许其它并发事务读取或更新该表。