现在的DB2 UDB系统中, 主要通过锁和隔离级别这两个主要的工具来控制并发连接,维护数据库中的数据在高并发的环境下的安全。
我们在这里将简要的阐述一下锁和隔离级别。
锁:
DB2 UDB中, 锁的主要作用对象是表和行, 其他如表空间和索引也是锁的对象, 但是因为其多为系统控制, 管理员和用户使用较少,在这里就不涉及了。
对于行级锁和表级锁, 它们的区别不言而喻, 主要是锁的对象不同。 当然锁对象的不同连带也会影响DB2的并发能力。
DB2中的表级锁主要有以下几种:
1. IS锁: 此锁作用于整个表,表示拥有此锁的应用连接要读取表中的某些数据, 但是在此应用连接读取具体的数据时, 还必须获得该行的行级锁;
2. IX锁: 此锁作用于整个表,表示拥有此锁的应用连接需要独占使用表中的某些数据, 但是在此应用连接独占使用具体的数据时, 还必须获得该行上相应的行级锁;
3. SIX锁: 此锁是锁转换的产物,表示应用连接拥有S和IX锁的特性;
4. S锁: 此锁作用于整个表, 拥有此锁的应用连接可以读取表中的任何纪录;
5. U锁: 此锁作用于整个表, 拥有此锁的应用连接可以读取表中的任何纪录,也可以更新表中的纪录, 但是更新时需要再获得X锁; 此锁主要在“select … with update”语句建立的可更新游标中起作用, 其他的应用可以读取表中的纪录, 但是不能更新它;
6. X锁: 此锁作用于整个表, 拥有此锁的应用连接独占的使用表中的任何纪录;可以进行更新或其他操作;
7. Z锁: 此锁作用于整个表, 也称超级独占锁,主要是在象修改表的定义、 删除表这一类的语句中会使用。 拥有此锁的应用连接对该表有完全的控制权。 其他的任何应用不能读取或更新表中的任何纪录。
在这里我们主要要看一下 IS/IX/SIX这三个锁。 在这三个锁中IS/IX本身并不具备使得应用连接可以读取或更新纪录的能力,应用连接要读取和更新纪录时, 需要再得到相应的行级锁; 反之亦然, 任何应用要获得行级锁操作数据记录之前, 也必须获得某个相应的表级锁。 SIX锁也是类似的情况。这就是为什麽在很多情况下我们使用的是行级锁, 但是用快照(SNAPSHOT)等工具却能够看到有表级锁存在的原因。
那麽DB2中又有哪些行级锁呢? 让我们来看下面的这张图:

此图中列出了DB2中包含的行级锁。 表中的第三列指出, 要获得此行级锁之前, 需要预先获得的表级锁, 这里列出的是最低要求。
这六个行级锁的主要功能如下:
1. S锁:此行级锁的拥有者可以读取该行的信息;
2. U锁:此行级锁的拥有者可以读取该行的信息,如果要更新该行,则仍然需要一个行级的X锁;其他的应用只能读取该行的信息;此锁主要是用于FOR UPDATE的游标。
3. X锁:此行级锁的拥有者可以更新该行的纪录,其他的应用不能连接此行的信息;
4. W锁:此锁和X锁类似,不同之处是此锁和NW锁兼容;
5. NS锁:类似于S锁,用于Next Key;
6. NW锁:类似于W锁,用于Next Key;
在DB2数据库中, 是通过行级锁和表级锁协调作用来提供较好的并发性, 同时保证数据库中数据的安全。 在DB2中缺省情况下使用行级锁(当然需要IS/IX锁配合),只有当出现锁资源不足, 或者是用命令指定使用表级锁的情况下, 才会在应用连接中使用表级锁。 对锁资源分配有兴趣的读者可以参考DB2的管理手册, 查找其中关于locklist和maxlocks参数的论述。对于用命令指定表级锁的情况, 可以参考DB2的命令手册中的lock table命令, 此命令用于直接锁表。
隔离级别:
下面让我们来看一下隔离级别。 隔离级别主要用于控制在DB2根据应用提交的SQL语句向DB2数据库中的相应对象加锁时, 会锁住哪些纪录, 也就是锁定的范围。 隔离级别的不同, 锁定的纪录的范围可能会有很大的差别。
隔离级别分为RR/RS/CS/UR这四个级别。 下面让我们来逐一论述:
1. RR隔离级别: 在此隔离级别下, DB2会锁住所有相关的纪录。 在一个SQL语句执行期间, 所有执行此语句扫描过的纪录都会被加上相应的锁。 具体的锁的类型还是由操作的类型来决定, 如果是读取,则加共享锁; 如果是更新, 则加独占锁。 由于会锁定所有为获得SQL语句的结果而扫描的纪录, 所以锁的数量可能会很庞大, 这个时候, 索引的增加可能会对SQL语句的执行有很大的影响,因为索引会影响SQL语句扫描的纪录数量。
2. RS隔离级别: 此隔离级别的要求比RR隔离级别稍弱,此隔离级别下会锁定所有符合条件的纪录。 不论是读取, 还是更新, 如果SQL语句中包含查询条件, 则会对所有符合条件的纪录加相应的锁。 如果没有条件语句, 也就是对表中的所有记录进行处理,则会对所有的纪录加锁。
3. CS隔离级别: 此隔离级别仅锁住当前处理的纪录。
4. UR隔离级别:此隔离级别下,如果是读取操作,不会出现任何的行级锁。对于非只读的操作,它的锁处理和CS相同。
在这四种隔离级别中, CS是缺省值。 这四种隔离级别均可以保证DB2数据库在并发的环境下不会有数据丢失的情况发生。 要注意的是如果对纪录进行了修改,需要在相应的纪录上加独占类型的锁, 这些独占类型的锁直到交易结束时才会被释放, 这一点在四种隔离级别下都是相同的。
分享到:
相关推荐
深刻理解DB2的锁及并发机制、索引原理、数据库参数、优化器原理、SQL语句调优等内部机理才能针对性地快速提出解决问题的方法;快照、db2pd、db2expln及事件监控器等则是必须熟练掌握的工具。《DB2数据库性能调整和...
### DB2数据库锁升级分析及处理步骤详解 在企业级应用环境中,数据库的高效稳定...通过以上步骤,我们可以有效地分析和处理DB2数据库中的锁升级问题,提升数据库的并发处理能力和响应速度,保障企业业务的顺利进行。
- DB2_Task_07和09_3.3可能涉及到数据库的事务管理和并发控制,学习如何在多用户环境中保证数据的一致性和完整性。 - DB2_Task_10和11可能涵盖了更复杂的数据操作,比如存储过程、触发器或者视图的创建和使用。 - ...
DB2数据库是IBM公司开发的一款关系型数据库管理系统,广泛应用于企业级数据存储和管理。数据库性能调整和优化是确保系统高效运行的关键环节,涉及到多个层面的技术和策略。本篇文章将深入探讨DB2数据库性能调整与...
根据给定文件中的标题、描述、标签以及部分内容,我们可以从中提炼出与DB2数据库相关的多个重要知识点。以下是对这些知识点的详细阐述: ### DB2数据库面试问题概览 #### 1. E-R图中的关系类型及其特点 E-R图...
- **DB2 Connect**:用于连接和访问DB2数据库的客户端工具。 ##### 2. **DB2访问** DB2提供多种访问方式,包括ODBC、JDBC、CLI(Command Line Interface)、PHP等,使应用程序可以跨平台无缝访问DB2数据库。 ###...
DB2和Oracle都是广泛应用的关系型数据库,它们都采用了锁作为主要的并发控制手段。本文将对比分析DB2和Oracle的并发控制,特别是锁的实现和差异。 首先,数据库事务的ACID特性是并发控制的基础,其中A(原子性)、C...
锁机制是数据库并发控制的重要手段之一,不合理的锁设置可能会导致性能瓶颈。 #### 3.1 锁列表配置 - **Lock List Memory**:锁列表内存,用于存储锁定信息。如果锁列表内存不足,可能会导致锁等待时间延长,影响...
DB2数据库中的锁机制是一种并发控制机制,用于维护数据库的一致性和隔离性。当多个用户或者进程尝试同时访问相同的数据时,锁机制可以帮助避免数据冲突。然而,锁等待问题则是在事务处理中,一个或多个应用程序或者...
合理设置事务隔离级别可以平衡并发性和数据一致性,避免死锁的发生。同时,优化事务处理逻辑,减少不必要的回滚和重试,可以显著提升系统吞吐量。 数据库的物理存储布局同样影响性能。通过合理分配表空间、分区和段...
DB2数据库支持多种特性,如事务处理、并发控制、备份恢复、安全性、性能调优等。9.7版本的改进可能包括更快的查询速度、更高的并发能力、更好的内存管理以及对Java EE 5和6的支持。在开发和部署Java应用程序时,理解...
通过实际操作,你可以更好地理解如何在DB2环境中执行SQL语句,如何设计数据库模式,以及如何处理并发控制和错误恢复等问题。这些实例可能涵盖了从简单的数据插入到复杂的业务逻辑实现的全过程。 数据转换文档则是...
【并发控制】在数据库系统中,特别是在DB2和Oracle这样的大型企业级数据库中,是确保多用户环境下数据一致性的重要机制。并发控制通过引入【锁】技术来防止事务间的冲突,保证ACID特性得以实现,即原子性(Atomicity...
这份PDF文档很可能是对DB2数据库在实际操作中的优化策略、配置技巧和故障排查方法的深入探讨,旨在帮助管理员提升DB2的性能、稳定性和安全性。 在DB2数据库管理中,有几个关键的知识点是所有管理员都需要掌握的: ...
DB2数据库分区特性(DPF)是DB2数据库中一种重要的技术,通过该技术可以将数据分散存储在不同的物理分区上,同时保证数据的一致性和完整性,从而提升数据库的性能和可伸缩性。下面是关于DB2数据库分区特性(DPF)的...
通过理解SQLCODE及其背后的错误信息,你可以更有效地诊断和解决DB2数据库中的问题,保持数据库系统的稳定运行。学习并掌握这些知识点,将使你在面对DB2错误时更加得心应手。在实际工作中,不断积累经验,结合官方...