1 DB2 多粒度封锁机制介绍
1.1 锁的对象
DB2支持对表空间、表、行和索引加锁(大型机上的数据库还可以支持对数据页加锁)来保证数据库的并发完整性。不过在考虑用户应用程序的并发性的问题上,通常并不检查用于表空间和索引的锁。该类问题分析的焦点在于表锁和行锁。
1.2 锁的策略
DB2可以只对表进行加锁,也可以对表和表中的行进行加锁。如果只对表进行加锁,则表中所有的行都受到同等程度的影响。如果加锁的范围针对于表及下属的行,则在对表加锁后,相应的数据行上还要加锁。究竟应用程序是对表加行锁还是同时加表锁和行锁,是由应用程序执行的命令和系统的隔离级别确定。
1.2.1 DB2表锁的模式
DB2在表一级加锁可以使用以下加锁方式:
名称缩写 全名 描述
IN 无意图锁 (Intenet None)
不需要行锁 该锁的拥有者可以读表中的任何数据,包括其他事务尚未提交的数据,但不能对表中的数据进行更改。
IS 意图共享锁(Intent Share)需要行锁配合 该锁的拥有者在拥有相应行的上的S锁时可以读取该行的数据。但不能对表中的数据进行更改。
IX 意图排它锁(Intent eXclusive)需要行锁配合 该锁的拥有者在拥有相应行的X锁时可以更改该行的数据。
SIX 共享携意图排它锁
(Share with Intent exclusive)需要行锁配合 锁的拥有者可以读表中的任何数据,如果在相应的行上能够获得X锁,则可以修改该行。SIX锁的获得比较特殊,它是在应用程序已经拥有IX锁的情况下请求S锁或者是在应用程序已经拥有S锁的情况下请求IX锁时生成的。
S 共享锁(Share)不需要行锁配合 锁的拥有者可以读表中的任何数据,如果表上被加上S锁,该表中的数据就只能被读取,不能被改变。
U 更新锁(Update)
不需要行锁配合 锁的拥有者可以读表中的任何数据,如果在升级到X锁之后,可以更改表中的任何数据。该锁是处于等待对数据进行更改的一种中间状态。
X 排它锁
(eXclusive)
不需要行锁配合 锁的拥有者可以读取或更改表中的任何数据。如果对表加上X锁,除了未提交读程序,其他应用程序都不能对该表进行存取。
Z 超级排它锁
(Super Exclusive)
不需要行锁配合 该锁不是通过应用程序中的DML语言来生成的。一般是通过对表进行删除(Drop)和转换(Alter)操作或创建和删除索引而获得的。如果对表上加上Z锁,其他应用程序,包括未提交读程序都不能对该表进行存取。
表三:DB2数据库表锁的模式
下面对几种表锁的模式进一步加以阐述:
IS、IX、SIX方式用于表一级并需要行锁配合,他们可以阻止其他应用程序对该表加上排它锁。
如果一个应用程序获得某表的IS锁,该应用程序可获得某一行上的S锁,用于只读操作,同时其他应用程序也可以读取该行,或是对表中的其他行进行更改。
如果一个应用程序获得某表的IX锁,该应用程序可获得某一行上的X锁,用于更改操作,同时其他应用程序可以读取或更改表中的其他行。
如果一个应用程序获得某表的SIX锁,该应用程序可以获得某一行上的X锁,用于更改操作,同时其他应用程序只能对表中其他行进行只读操作。
S、U、X和Z方式用于表一级,但并不需要行锁配合,是比较严格的表加锁策略。
如果一个应用程序得到某表的S锁。该应用程序可以读表中的任何数据。同时它允许其他应用程序获得该表上的只读请求锁。如果有应用程序需要更改读该表上的数据,必须等S锁被释放。
如果一个应用程序得到某表的U锁,该应用程序可以读表中的任何数据,并最终可以通过获得表上的X锁来得到对表中任何数据的修改权。其他应用程序只能读取该表中的数据。U锁与S锁的区别主要在于更改的意图上。U锁的设计主要是为了避免两个应用程序在拥有S锁的情况下同时申请X锁而造成死锁的。
如果一个应用程序得到某表上的X锁,该应用程序可以读或修改表中的任何数据。其他应用程序不能对该表进行读或者更改操作。
如果一个应用程序得到某表上的Z锁,该应用程序可以读或修改表中的任何数据。其他应用程序,包括未提交读程序都不能对该表进行读或者更改操作。
IN锁用于表上以允许未提交读这一概念。
1.2.2 DB2行锁的模式
除了表锁之外,DB2还支持以下几种方式的行锁。
名称缩写 全名 需要表锁的最低级别 描述
S 共享锁
(Share) IS 该行正在被某个应用程序读取,其他应用程序只能对该行进行读操作。
U 更改锁
(Update) IX 某个应用程序正在读该行并有可能更改该行,其他应用程序只能读该行。
X 排它锁
(eXclusive) IX 该行正在被某个应用程序更改,其他应用程序不能访问该行。
W 弱排它锁
(Weak eXclusive) IX 当一行数据被插入表中的时候,该行上会被加上W锁。锁的拥有者能够更改该行,该锁基本与X锁相同,除了它与NW锁兼容。
NS 下一键共享锁
(Next Key Share) IS 锁的拥有者和其他程序都可以读该行,但不能对该行进行更改。当应用程序处于RS或CS隔离级下,该锁用来替代S锁。
NX 下一键排它锁
(Next Key eXclusive) IX 当一行数据被插入到索引中或从索引中被删除的时候,该行的下一行上会被加上该锁。锁的拥有者可以读,但不能更改锁定行。该锁与X锁类似,只是与NS锁兼容。
NW 下一键弱排它锁
(Next Key Weak eXclusive) IX 当一行被插入到索引中的时候,该行的下一行会被加上该锁。锁的拥有者可以读但不能更改锁定行。该锁与X和NX锁类似,只是与W和NS锁兼容。
表四:DB2数据库行锁的模式
DB2锁的兼容性
锁A的模式 锁B的模式
IN IS S IX SIX U X Z
IN Y Y Y Y Y Y Y N
IS Y Y Y Y Y Y N N
S Y Y Y N N Y N N
IX Y Y N Y N N N N
SIX Y Y N N N N N N
U Y Y Y N N N N N
X Y N N N N N N N
Z N N N N N N N N
表五:DB2数据库表锁的相容矩阵
锁A的模式 锁B的模式
S U X W NS NX NW
S Y Y N N Y N N
U Y N N N Y N N
X N N N N N N N
W N N N N N N Y
NS Y Y N N Y Y Y
NX N N N N Y N N
NW N N N Y Y N N
表六:DB2数据库行锁的相容矩阵
下表是笔者总结了DB2中各SQL语句产生表锁的情况(假设缺省的隔离级别为CS):
SQL语句 行锁
模式 表锁
模式 允许的锁模式
Select * from table_name for read only with rr.. 无 S IN,IS,S,U
Select * from table_name for read only with rs.. NS IS IN,IS,S,SIX,U
Select * from table_name for read only with cs.. 无 无
Select * from table_name for read only with ur.. 无 无
Select * from table_name for update with rr 无 U IN,IS,S
Select * from table_name for update with rs U IX IN,IS,IX
Select * from table_name for update with cs U IX IN,IS,IX
Select * from table_name for update with ur U IX IN,IS,IX
Insert into table_name…… W IX IN,IS,IX
Update table_name…… X IX IN,IS,IX
Delete from table_name…… X IX IN,IS,IX
lock table table_name in share mode 无 S IN,IS,S,U
lock table table_name in exclusive mode 无 X IN
Alter table t1 add column id int Z
Drop table t1 X Z
Create table t1(id int) Z
注:alter,create,drop会在syscolumns,systables,systablespaces,sysuserath等数据字典系统表中加行级锁。
1.3 DB2锁的升级
每个锁在内存中都需要一定的内存空间,为了减少锁需要的内存开销,DB2提供了锁升级的功能。锁升级是通过对表加上非意图性的表锁,同时释放行锁来减少锁的数目,从而达到减少锁需要的内存开销的目的。锁升级是由数据库管理器自动完成的,有两个数据库的配置参数直接影响锁升级的处理:
locklist—在一个数据库全局内存中用于锁存储的内存。单位为页(4K)。
maxlocks—一个应用程序允许得到的锁占用的内存所占locklist大小的百分比。
锁升级会在这两种情况下被触发:
某个应用程序请求的锁所占用的内存空间超出了maxlocks与locklist的乘积大小。这时,数据库管理器将试图通过为提出锁请求的应用程序申请表锁,并释放行锁来节省空间。
在一个数据库中已被加上的全部锁所占的内存空间超出了locklist定义的大小。这时,数据库管理器也将试图通过为提出锁请求的应用程序申请表锁,并释放行锁来节省空间。
锁升级是有可能会失败的,比如,现在一个应用程序已经在一个表上加有IX锁,表中的某些行上加有X锁,另一个应用程序又来请求表上的IS锁,以及很多行上的S锁,由于申请的锁数目过多引起锁的升级。数据库管理器试图为该应用程序申请表上的S锁来减少所需要的锁的数目,但S锁与表上原有的IX锁冲突,锁升级不能成功。
如果锁升级失败,引起锁升级的应用程序将接到一个-912的SQLCODE。
分享到:
相关推荐
db2相关锁情况介绍
关于db2锁说明,以表格对比的方式详细说明db2数据库中各个锁之间的区别。方便理解db2数据库关于锁的处理以及设计。
db2锁的问题db2锁的问题db2锁的问题db2锁的问题db2锁的问题db2锁的问题
详细介绍DB2数据库锁升级分析及处理步骤。
db2 查询锁的方法,实际操作解决数据库锁的方法
常见DB2锁等待解决流程,DB2常见问题汇总,经典
DB2 V9.7 锁事件监控 文档 DB2 锁 锁监控 监控 DB2文档
DB2 SQL 通过函数(CONCAT/POSSTR/LOCATE)实现行转列,列转行 可以按照标点把多列转换为一行,多行转换为一列
DB2锁问题处理最佳实践 DB2锁概述 DB2锁问题监控和定位 DB2锁问题调优 DB2 9.7锁机制深入分析 DB2锁案例分享
db2 get snapshot for locks on dbname 查看锁表 application handle db2 "list applications" 其中appl.handle为锁表进程 db2 "force application(进程号)
ibm数据库管理资料db2资源锁管理,ibm数据库管理资料db2资源锁管理.
教你如何在db2环境中捕获锁信息,非常实用,非常有效!
因为Load数据没有事务日志记录支撑,在Load数据后可能会照成表锁现象。 通过文档中的表述可解决该问题。
了解DB2锁的概念、掌握其具体操作和作用。
DB2 SQL介绍DB2 SQL介绍DB2 SQL介绍
《舞动db2系列从oracle到db2开发—从容转身》是“舞动db2”系列的第二本,分为三大部分,共8章。第一部分从开发者遇到的问题进行分析,提出在oracle兼容模式下开发数据应用的新思路,并讲述了从oracle迁移到db2的...
db2锁分析
DB2存储过程介绍 存储过程定义 指针 动态SQL语句
ORACLE转DB2对照全解,学习数据库转换的好帮手
DB2简要介绍与快速入门