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锁的概述、监控与定位方法、调优技巧、9.7版本的锁机制以及案例分享。 DB2锁概述: DB2数据库使用锁来维护数据一致性,并控制对数据的并发访问。锁机制是事务管理的一部分,与事务、日志和隔离...
本文档将详细介绍DB2数据库的基本概念、基本命令和基本操作。 数据库创建和连接 在DB2中,创建数据库使用CREATE DATABASE语句,例如:CREATE DATABASE DB2_GCB ON G: ALIAS DB2_GCB USING CODESET GBK TERRITORY ...
4. **DB2数据库性能调整和优化.pdf**:此文档将深入讨论如何提升DB2的性能,包括索引优化、查询优化、内存调优、锁机制等。DBA在日常工作中,需要掌握这些技巧来确保数据库高效运行。 5. **精:RedHat_Enterprise_...
本教程为DB2认证考试提供了全面的学习资源,包括DB2的最新版本(如DB2 9.7)的功能介绍、操作指南和技术要点。 #### 二、重要知识点详解 ##### 1. DB2 Techie Survival Guide - **目标受众**:面向技术人员,尤其...
本文将基于提供的内容,详细介绍DB2中的错误代码及其含义。 #### 一、SQL执行成功(SQL Success) - **SQLCODE**: 00000 - **SQLSTATE**: 00000 - **说明**:此状态码表示SQL语句执行成功。 #### 二、SQL警告...
为了帮助开发者更好地理解并处理这些问题,本文将详细介绍DB2中常见的错误代码及其含义。通过深入分析这些错误代码,可以提高对DB2数据库系统的理解和应用能力。 #### 二、错误代码解析 ##### 1. SQL执行成功(SQL...
在IT行业中,尤其是在数据库管理领域,理解并掌握DB2状态码是至关重要的。DB2状态码,也称为SQLCODE或SQLSTATE,是...通过本文的详细介绍,希望能帮助读者建立起对DB2状态码的全面理解,从而在实际工作中更加游刃有余。
同时,讲解DB2的内部工作原理,如存储结构、事务处理、并发控制和锁机制。 2. **SQL执行计划分析**:DB2使用查询优化器来选择最优的执行计划。书中可能详细解释如何阅读和理解执行计划,以及如何通过EXPLAIN语句...
**1.4 典型案例介绍** - **1.4.1 创建存储过程时,应先删除已存在的同名同参数的存储过程** - 解决方法:在创建新的存储过程之前,首先使用`DROP PROCEDURE`命令删除旧的同名存储过程。 - **1.4.2 应确保处理SQL...
本文档主要介绍了DB2的几个重要版本及其特点。 ##### 1. DB2产品版本 - **DB2 Everyplace**:针对移动设备设计,支持多种移动操作系统,如Palm OS、Windows Mobile Edition等。 - **DB2 Personal Edition (DB2 ...
### DB2.DBA系统管理、运维与应用案例详解 #### DB2概述 DB2是IBM公司推出的一款关系型数据库管理系统,广泛应用...通过本文的介绍,希望能帮助读者更好地理解和掌握DB2的相关知识,为实际工作中的问题解决提供参考。
本文将详细介绍三个重要的实践方法来帮助您改善DB2存储过程的性能和健壮性。 #### 1. 优化SQL语句结构 **实践方法**:通过精简和重构SQL语句,可以显著减少存储过程中不必要的操作,从而提高执行效率。例如,在...
为了帮助DBA(数据库管理员)和技术支持人员更好地理解这些异常背后的原因,并快速定位问题所在,本篇文章将详细介绍DB2中的常见异常代码及其含义。通过深入分析这些异常代码,我们可以更加高效地解决问题,提升系统...
### IBM DB2 DWE数据仓库指南 #### 一、概述 ...通过上述详细介绍的技术点可以看出,无论是基础的操作还是高级的应用场景,DB2 DWE都能够满足企业级数据仓库的需求,帮助企业更好地利用数据驱动决策。
### DB2常用命令知识点 #### 一、建立数据库 **命令:** `CREATE DATABASE DB2_GCB ON G: ALIAS DB2_GCB USING ...以上是DB2中常用的命令及其相关知识点的详细介绍,这些命令可以帮助您更有效地管理和操作DB2数据库。
WAS和DB2都提供了不同程度的支持来帮助开发者管理数据库锁。例如,可以通过配置锁定模式、锁定级别等方式来优化数据库访问的并发性。此外,还需要关注死锁等问题,确保应用的稳定性和性能。 #### 八、动态SQL 动态...