1.锁的基本概念和功能
所谓锁(Lock),实际上是加在数据库、表空间、表、行或者数据页上的一种标记,用户在对各种数据库对象进行读取或者写入操作时首先要看该对象上的锁是否允许其进行相应操作。从允许用户进行操作的种类,把锁分成两种基本类型:共享锁(Shared Lock,简称S锁)和排它锁(Exclusive Lock,简称X锁)。
共享锁
共享锁又称为读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其它事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
排他锁
排他锁又称为写锁,若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能对A加任何类型的锁,直到T释放A上的锁。这就保证了其它事务在T释放A上的锁之前不能再读取和修改A。
2.加锁准则
数据库管理系统对于锁的控制要满足三条规则:
规则1是,任何人在任何时候在任何实体上最多只能持有一个锁;
规则2是,如果一个用户需要单一实体上的两个不同的锁,那么获得的锁将是这两个锁中限制较严的那个;
规则3是,每个锁必须体现出所有低粒度中存在的任何锁。
3.加在数据库上的锁
共享锁模式
CONNECT TO sample IN SHARE MODE USER db2admin USING 123456
排他锁模式
CONNECT TO sample IN EXCLUSIVE MODE USER db2admin USING 123456
5.加在表上的锁
意向无锁(Intent None,简称IN锁)
锁的拥有者可以读取锁定表中的数据(包括未提交的数据),但不能更改这些数据。在这种模式中,锁的拥有者不获取行级别的锁;其它并发应用程序可以读取和更改表中的数据。
在UR隔离级下发出只读的查询语句时会在表上加这种锁:
SELECT*FROM<表名>FORREADONLYWITHUR
意向共享锁(Intent Share,简称IS锁)
锁的拥有者在拥有相应行上的S锁时可以读取锁定表中的数据,但不能更改这些数据。其他并发的应用程序仍可以读取和更改表中的数据(但不能更改已经加上S锁的行)。在CS隔离级下,当发出如下语句时,会在表上加上IS锁:
SELECT * FROM <表名> FOR READ ONLY WITH RS
意向排他锁(Intent Exclusive,简称IX锁)
锁拥有者在拥有相应行上的X锁时可以读取和更改被锁定表中的数据。其他并发应用程序仍然可以读取和更改表中的数据(已经加上X锁的行除外)。在CS隔离级下,可以在表上加IX锁的情况有多种:
SELECT * FROM <表名> FOR UPDATE WITH RS(同时会在相应的行上加U锁)
SELECT * FROM <表名> FOR UPDATE WITH CS(同时会在相应的行上加U锁)
意向排他锁(Intent Exclusive,简称IX锁)
SELECT * FROM <表名> FOR UPDATE WITH UR(同时会在相应的行上加U锁)
INSERT INTO <表名> …… (同时会在相应的行上加W锁)
UPDATE <表名> …… (同时会在相应的行上加X锁)
DELETE <表名> …… (同时会在相应的行上加X锁)
共享意向排他锁(Share with Intent Exclusive,简称SIX锁)
锁拥有者可以读取表中的数据,如果能够获得相应行上的X锁,还可以更改对应的行。其它并发的应用程序可以读取但不能更新被锁定表中的数据。SIX锁的获取有两种方式,一种是应用程序已经拥有IX锁时请求S锁,另一种是应用程序已经拥有S锁时请求IX锁。
共享锁(Share,简称S锁)
锁的拥有者可以读取但不能修改表中的任何数据。其他并发的应用程序可以读取但不能更新表中的数据。在CS隔离级下,给表加上S锁的方法有两种,一种是使用LOCK语句:
LOCK TABLE <表名> IN SHARE MODE
另一种是使用带有可重复的读隔离级的SELECT语句:
SELECT * FROM <表名> FOR READ ONLY WITH RR
更新锁(Update,简称U锁)
锁的拥有者可以读取表中的任何数据,如果在升级到X锁之后,可以更改表中的任何数据,该锁是处于等待对数据进行更改的一种中间状态。在CS隔离级下,更新锁的获取方式为:
SELECT * FROM <表名> FOR UPDATE WITH RR (不需要任何行锁)
排他锁(Exclusive,简称X锁)
锁的拥有者可以读取或者修改表中的任何数据。其他应用程序,除了隔离级为未提交的读之外,都不能对该表进行任何存取。在CS隔离级下,X锁的获取方式为:
LOCK TABLE <表名> IN EXCLUSIVE MODE
超级排他锁(Super Exclusive,简称Z锁)
该锁是在对表进行结构上修改时获得的,创建表、删除表或者修改表的结构,都会给该表加上Z锁。其他应用程序(即使是未提交的读隔离级的)不能对该表进行任何存取。在CS隔离级下,获得Z锁的方式有:
CREATE TABLE ……
ALTER TABLE ……
DROP TABLE ……
6.加在行上的锁
共享锁(Share,简称S锁)
该行正在被某个应用程序读取,其他应用程序只能对该行进行读操作。在行上加S锁至少需要在对应的表上加IS锁。
更新锁(Update,简称U锁)
某个应用程序正在读取该行,并且有可能修改该行,其他应用程序只能读该行。在行上加U锁至少需要在对应的表上加IX锁。
排他锁(Exclusive,简称X锁)
该行正在被某个应用程序修改,其他应用程序不能访问该行。在行上加X锁至少需要在对应的表上加IX锁。
弱排他锁(Weak Exclusive,简称W锁)
当一行数据被插入表中的时候,该行会被加上W锁,锁的拥有者能够更改该行。W锁与NW锁兼容,除此之外,W锁的特性与X锁完全相同。在行上加W锁至少需要在对应的表上加IX锁。
下一键共享锁(Next Key Share,简称NS锁)
锁的拥有者和其他应用程序都可以读取该行,但不能修改该行。该锁用于当应用程序处于RS或者CS隔离级下时替换S锁。在行上加NS锁至少需要在对应的表上加IS锁。
下一键排他锁(Next Key Exclusive,简称NX锁)
当一行数据被插入到索引中或者从索引中被删除时,该行的下一行上会被加上该锁,锁的拥有者可以读,但不能修改锁定行。该锁与X锁类似,只是与NS锁兼容。在行上加NX锁至少需要在对应的表上加IX锁。
下一键弱排他锁(Next Key Weak Exclusive,简称NW锁)
当一行被插入到索引中的时候,该行的下一行会被加上该锁。锁的拥有者可以读取但是不能修改锁定行。该锁与X和NX锁类似,只是与W和NS锁兼容。在行上加NW锁至少需要在对应的表上加IX锁。
锁的兼容性