快捷搜索:

DB2通用数据库的并发性

在数据库治理系统(DBMS)的领域中,术语“并发性”用于表示不止一个利用法度榜样基础上(从用户的角度来看)同时造访同一数据的能力。由于 DBMS 的主要优点之一便是可以在多个用户和多个利用法度榜样中共享数据,以是数据库系统应该供给一种治理并发造访数据的措施。DBMS 必须确保掩护数据的同等状态和数据的完备性。

取得该效果的一种措施便是实施只串行(serial-only)模式来处置惩罚数据库哀求。即每个事务都要等待另一事务(具有更高的优先权或者比它早启动)完成其事情。然而,对付现在的在线系统和客户非常来说,这种处置惩罚要领所孕育发生的机能水平的确令人无法吸收。

而另一种措施便是,DBMS 可以经由过程 锁的要领治理多个利用法度榜样对数据的造访。锁是一种软件机制,用于在掩护数据完备性和同等性的同时,容许尽可能大年夜的吞吐量(经由过程最大年夜限度地并发造访数据)。

并发性节制的紧张性

假如没有节制并发性的有效措施,就可能侵害数据的完备性和同等性。DBMS 必须保护数据库,防止发生下列状况:

损掉更新—— 假设利用法度榜样 A 和利用法度榜样 B 同时读取数据库中的同一行,并且都为此中某一列谋略新值。假如利用法度榜样 A 先用其新值更新该行,随后利用法度榜样 B 又更新同一行,那么第一次的更新(由利用法度榜样 A 履行的)就会损掉。

弗成重复读—— 某些利用法度榜样进程可能要求完成以下事故序列:法度榜样 A 从表中读取特定的一行,然后继承进行其他的 SQL 哀求。稍后,法度榜样 A 再次读取开始的那一行,并且必须在所有的列中找到与第一次读取相同的值。假如短缺相宜的并发性节制,另一利用法度榜样就可能在这两次读取操作之间改动该行数据。

造访未提交的数据—— 利用法度榜样 A 更新一行中的某些列的值,而在提交该改动之前,利用法度榜样 B 读入该行的新(更新)值。假如利用法度榜样 A 接着又“撤销”更新值(经由过程法度榜样逻辑中的 SQL ROLLBACK 语句,或者由于发生差错由 DB2 UDB 自动进行回滚),那么,利用法度榜样 B 对该行的处置惩罚便是基于未提交的(因而可能是不精确的)数据进行的。

在掩护数据完备性的同时,供给多个利用法度榜样同时造访数据的能力称作 并发性节制。

锁是一种由 DB2 UDB 用于完成并发性节制的软件机制。锁实质上便是一个节制块,将 DB2 UDB 工具或资本与利用法度榜样关联起来,并节制其他利用法度榜样若何造访同一工具或资本。与 DB2 UDB 资本有关联的利用法度榜样被称为“持有”或“拥有”该锁。

经由过程应用锁,DB2 UDB(治理该数据库)可以防止发生上述几类问题。DB2 UDB 与另一 MVS 地址空间 IRLM 共同治理这些锁。IRLM 将跟踪这些锁及其所有者,以确定利用法度榜样哀求的 DB2 UDB 资本是否可用于该类事情。资本可所以 锁定的或 共享的,这取决于当前资本上的锁的“持有者”所进行的处置惩罚类型,以及哀求利用法度榜样所预期的处置惩罚类型。

锁模式

最常用的两种锁模式是 共享的和 排他的。共享锁与只读操作有关联,这意味着持有该锁的利用法度榜样可以读取数据,而其他利用法度榜样也可以读取该数据。排他锁与写操作有关联,这意味着持有该锁的利用法度榜样有资格更新数据,但在锁所有者完成更新(将改动提交给数据库)并开释该锁之前,其他利用法度榜样无法应用该数据。

DB2 UDB 和 IRLM 应用其他类型和子类型的锁模式来实现锁定和并发性节制。您可以在 DB2 UDB Administration 手册中找到关于这点的更多具体描述。

锁定粒度

除了应用各类锁模式,DB2 UDB 还供给了不合的锁定级别,用以节制被锁定命据的范围。各类级别表示了 DB2 UDB 应用的锁定粒度,其范围可以从单个行到全部表空间。DB2 UDB 根据锁定粒度来应用不合的锁模式。

具有多种锁定级其余来由十分简单。某些利用法度榜样可能要求有权读取或更新大年夜范围的数据,而其他利用法度榜样则可能只要求造访窄得多的范围。假如只能应用一种锁定级别,则会低落全部系统机能。例如,一会儿锁定太多半据会强制其他利用法度榜样进行不需要的等待。否则,DB2 UDB 可能应用过多的系统资本,考试测验办事对附加数据资本进行锁定的附加哀求。能够实现多种级其余锁粒度可以极大年夜地前进并发性水平。

在一段预设的光阴距离之后(请参阅标题 DEADLOCK TIME 下面的评论争论),DB2 UDB 将终止当前事情单元,由于某个利用法度榜样陷入逝世锁状态(平日为所干事情起码的利用法度榜样)。这将开释终止法度榜样所持有的锁,并容许残剩的利用法度榜样继承下去。 DB2 UDB 将向被终止的利用法度榜样的 SQLCA 发送描述性的差错消息和信息。

实用法度榜样和敕令的并发机制

当 SQL 利用法度榜样应用事务锁来节制对 DB2 UDB 工具的并发造访时,DB2 UDB 实用法度榜样和敕令可以经由过程其他措施造访 DB2 UDB 工具,即 声明(claim)、放弃(drain)和 兼容性规则。

声明是指看护 DB2 UDB 当前正在造访某个特定工具。提交之后,该声明平日不会继承存在。为了鄙人一事情单元里造访 DB2 UDB 工具,利用法度榜样必要进行新的声明。声明看护 DB2 UDB 当前正关注某个 DB2 UDB 工具,或是该工具上存在活动。只要 DB2 UDB 工具上存在声明,在开释那些声明之前,就不能采取任何放弃(drain)。

放弃(drain)是指经由过程下列要领来造访 DB2 UDB 工具的动作:

阻拦对工具进行任何新的声明。

等待开释工具上现有的所有声明。

DB2 UDB 工具上的放弃导致 DB2 UDB 竣事(quiesce)所有当前正声明该资本的利用法度榜样,其要领为容许它们到达提交点,但阻拦它们(或任何其他的利用法度榜样进程)进行新的声明。Drain 锁还阻拦冲突进程同时放弃(drain)同一工具。

DB2 UDB 一样平常经由过程一组兼容性规则来节制实用法度榜样的并发操作。假如两个实用法度榜样不必要同时以弗成兼容的模式造访相同的 DB2 UDB 工具,就将它们视为是“兼容的”。当一个实用法度榜样功课开始时,DB2 UDB 就反省系统,查看当前是否有其他任何实用法度榜样正处置惩罚同一 DB2 UDB 工具。假如该工具当前未被另一实用法度榜样造访,或者假如另一履行实用法度榜样是可兼容的,该实用法度榜样才可以继承。

在履行利用法度榜样时,DB2 UDB 首先应用页面锁或行锁,并且只要该进程造访相对较少的页面或行,还会继承这样做。当该利用法度榜样造访许多页面或行时,DB2 UDB 将变为应用表锁、表空间锁或分区锁。调用锁进级的准确光阴是由 LOCKSIZE 和 LOCKMAX.的值抉择的。

LOCKSIZE

LOCKSIZE 是 CREATE/ALTER TABLESPACE 语句的选项,在利用法度榜样进程造访表空间中的表时,节制 DB2 UDB 获取的何种类型的锁(即,它抉择该锁的“大年夜小”,这无意偶尔也称作锁粒度)。该选项的可所以 LOB、TABLESPACE、TABLE、PAGE、ROW 和 ANY。

CREATE TABLESPACE 语句的 LOCKSIZE 参数默觉得 ANY。LOCKSIZE ANY 容许 DB2 UDB 选择锁大年夜小。DB2 UDB 平日将 LOCKSIZE PAGE 用于非 LOB 的表,而将 LOCKSIZE TABLESPACE 用于 LOB 表。

我建议在创建表空间时应用该默认值,除非您有来由进行其他选择。假如您选择改动 LOCKSIZE,那么就要根据应用该表空间的利用法度榜样的机能监控结果和并发性特征来做抉择。

应用何种大年夜小的锁

在 DB2 V4 中才开始可以应用行级锁。之前,数据页是最小的锁定单元。I/T 行业中的许多人都假定行锁是并发性问题的灵丹仙丹,但实际上,它并不能办理所有的并发性问题。在经历许多锁等待、逝世锁和超时的情况中,它大概供给了较大年夜的改进。但在其他情形下,DB2 UDB 可能在获取更多锁上耗损资本,同时无法成比例地前进并发性。

由于 IRLM 获取、掩护和开释行锁所需的处置惩罚与页面锁必要的大年夜致相同,以是关于指定锁大年夜小的抉择着实便是在较高的锁定开销与并发性的潜在前进之间进行权衡。

是以,至于是应用页面锁照样应用行锁,这取决于您的数据和利用法度榜样的特征。假如您觉察到应用页面锁定级其余表空间的数据页上存在大年夜量竞争,那么就请斟酌应用行锁。经由过程在行级别而非页面级别长进行锁定,可以极大年夜地削减与其他利用法度榜样进程的竞争,分外在造访是在随机的环境下。

您可能还会对下面的文章感兴趣: