DB2 9 根蒂根基底细(730 考试)认证指南,第 6 局部: 数据并发性(5)

developerWorks








锁和机能

锁兼容性

假设数据本钱上的一种锁形态允许在同一本钱上布置另一个锁,就感受这两种锁(或两种形态)是兼容的。每当一个事项持有数据本钱上的锁,而第二个事项哀告同一本钱上的锁时,DB2 数据库管理按次会反省两种锁形态以坚决它们能否兼容。假设锁是兼容的,则将锁授予第二个事项(假定没有其他事项在期待该数据本钱)。但是,假设锁不兼容,则第二个事项必须期待,直到第一个事项开释它的锁为止,然后它才可以获取对本钱的拜候权并连续处置惩罚。(假设本钱上有多个与新哀告的锁不兼容的锁,则第二个事项必须比及它们悉数被开释为止。)请参阅 IBM DB2 9 Administration Guide: Performance 文档(或在 DB2 信息中心搜索 Lock type compatibility 主题)以获取关于各个锁之间能否兼容的特定信息。

锁转换

当事项实验拜候它曾经持有锁的数据本钱,但是所需的拜候方式需要比已持有的锁更严格的锁时,则所持有的锁的形态换取成更严格的形态。将曾经持有的锁的形态换取成更严格形态的操纵称为锁转换。迸发锁转换是由于一个事项统一时间内只能在一个数据本钱上持有一个锁。

在大年夜多半环境下,对行级锁实行锁转换,转换进程相称伟大年夜。比方,假设持有共享(S)或更新(U)行级锁,但是需要互斥(X)锁,则所持有的锁将被转换成互斥(X)锁。但意向互斥(IX)锁和共享(S)锁是特例,由于无法确定个中哪个更严格。因而,假设持有个中一种行级锁但又需要另一种锁,则所持有的锁将转换成带意向互斥的共享(SIX)锁。假定所哀告的锁形态更严格的话,则相同的转换会使所哀告的锁形态成为持有锁的新形态。(仅当所持有的锁可以增加其严格性时,才会迸发锁转换。)在转换了锁形态之后,锁处于所获取的最高形态,直到持有该锁的事项终了为止。









锁晋级

全数的锁都需要存储空间;由于可用空间并不是无穷的,所以 DB2 数据库管理按次必须限制锁可以运用的空间(这是经过 maxlocks 数据库设置配备布置参数完成的)。为了预防特定命据库代劳署理赶过已成立的锁空间限制,当获取的(随意任性规范的)锁过多时,会自动实行称为锁晋级 的进程。锁晋级是一种转换,它将同一表内几个独自的行级锁转换成一个单一的表级锁。由于锁晋级是在外部处置惩罚的,所以专一可从外部检测到的后果可以或许只是对一个和多个表的并发拜候增加了。

以下是锁晋级的义务道理:当事项哀告锁而锁存储空间已满时,就选择与该事项相联络关系的一个表,让它获取一个表级锁,开释该表的全数行级锁(从而在锁列表数据结构中让出空间),并将表级锁添加到锁列表。假设这个进程所开释的空间不敷,则选择另一个表,重复这个进程,直到开释了充足的可用空间为止。这时,事项将获取所哀告的锁并连续实行。但是,假设在该事项的全数行级锁都曾经晋级之后,模仿照旧没有取得需要的可用锁空间,则(经过 SQL 错误编码)要求事项提交或回滚它启动以来所做的全数换取,然后事项终了。









锁超时

每当一个事项在特定命据本钱(比方,表或行)上持有锁时,直到持有锁的事项终了并开释它所获取的全数锁之前,其他事项对该本钱的拜候都可以或许被回绝。假设没有某种锁超时检测机制,则事项可以或许无穷期地期待锁的开释。比方,有可以或许出现这种环境:一个事项在期待另一个用户的利用按次所持有的锁被开释,而该用户离开了他或她的义务站,但忘了实行一些允许利用按次终了拥有锁的事项的交互。显然,此类环境会招致极差的利用按次机能。要制止迸发此类环境时停滞其他利用按次的实行,可以在数据库的设置配备布置文件中指定锁超时值(经过 locktimeout 数据库设置配备布置参数)。该参数节制任何事项期待获取所哀告的锁的时间。假设在指定的时间间隔已往之后还未取得想要的锁,则期待的利用按次采取一个错误,并回滚哀告该锁的事项。漫衍式事项利用按次环境尤其随意孕育发生此类环境;可以经过运用锁超时制止它们。









去世锁

固然可以经过成立锁超时来制止一个事项无穷期地期待另一个事项开释锁的环境,但是锁超时无法处置惩罚两个或更多事项对锁的争用。这种环境称为去世锁去世锁循环。阐明去世锁的迸发缘由的最佳步调是举例阐明:假定事项 1 在表 A 上获取了互斥(X)锁,而事项 2 在表 B 上获取了互斥(X)锁。目前,假定事项 1 实验在表 B 上获取互斥(X)锁,而事项 2 实验在表 A 上获取互斥(X)锁。这两个事项的处置惩罚都将被挂起,直到同意第二个锁哀告为止。但是,由于在任何一个事项开释它目下当今持有的锁(经过实行或回滚操纵)之前,这两个事项的锁哀告都不会被同意,并且由于这两个事项都不克不及开释它目下当今持有的锁(由于它们都已挂起并期待锁),所以它们都堕入了去世锁循环。图 7 阐明确了然这个去世锁场景。

图 7. 去世锁循环
去世锁循环

当去世锁循环迸发时,除非某些外部代劳署理终了干涉干与干与,否则所触及的全数事项将无穷期地期待开释锁。在 DB2 UDB 中,用于处置惩罚去世锁的代劳署理是称为去世锁检测器 的异步体系布景进程。去世锁检测器的专一职责是定位和处置惩罚在锁定子体系中找到的任何去世锁。每个数据库有自身的去世锁检测器,它在数据库初始化进程中激活。激活之后,去世锁检测器在大年夜多半时间处于 “休眠” 形态,但会以预置的时间间隔被 “叫醒”,以确定锁定子体系中能否存在去世锁循环。假设去世锁检测器在锁定子体系中发现去世锁,则随机选择去世锁触及的一个事项,终了并回滚它。选择的事项收到一个 SQL 错误编码,它所取得的全数锁都被开释;多么,剩下的事项就可以连续实行了,由于去世锁循环曾经被冲破了。









锁粒度

正如先前提到的,每当一个事项在特定命据本钱上持有锁时,在持有锁的事项终了之前,其他事项对该本钱的拜候都可以或许被回绝。因而,为了终了优化以获取最大年夜的并发性,行级锁往往比表级锁更好,由于它们所限制拜候的本钱要小得多。但是,由于所获取的每个锁都需要肯定命量的处置惩罚时间和存储空间,才华获取锁并终了管理,所以单个表级锁需要的开支比几个独自的行级锁少。除非此外指定,否则默许环境下获取行级锁。

可以经过运用 ALTER TABLE ... LOCKSIZE TABLE、ALTER TABLE ... LOCKSIZE ROW 和 LOCK TABLE 语句节制锁的粒度(即,获取行级锁照旧表级锁)。ALTER TABLE ... LOCKSIZE TABLE 语句提供了确定粒度的全局步调,它使得全数拜候特定表中行的事项都获取表级锁。另一方面,LOCK TABLE 语句允许在单个事项级别获取表级锁。在运用这两种语句时,事项在需要锁时就获取单个共享(S)或互斥(X)表级锁。后果,由于只需获取和开释一个表级锁,而不是多个差其他行级锁,所以锁定机能往往会前进。但是,在运用表级锁时,假设长时间运转的事项获取互斥而不是共享表级锁,那么并发性会低落。









事项和锁定

从锁定的角度来看,全数事项往往归为以下几类之一:

  • 只读:这是指只读性的事项,它们包罗 SELECT 语句(它们素质上就是只读的)、指定了 FOR READ ONLY 子句的 SELECT 语句或意义虽不明确但由于在预编译和/或绑定进程中指定了 BLOCKING 选项而看作是只读的 SQL 语句。
  • 偏向于换取:这是指有可以或许终了换取的事项,它们包罗指定了 FOR UPDATE 子句的 SELECT 语句或许那些意义虽不明确但由于 SQL 预编译器正文它的步调而看作是偏向于终了换取的 SQL 语句。
  • 换取:这是指肯定会终了换取的事项,它们包罗 INSERT、UPDATE 和/或 DELETE 语句,但不包罗 UPDATE ... WHERE CURRENT OF ... 或 DELETE ... WHERE CURRENT OF ... 语句。
  • 游标节制:这是指包罗 UPDATE ... WHERE CURRENT OF ... 和 DELETE ... WHERE CURRENT OF ... 语句的事项。

只读事项往往运意图向共享(IS)和/或共享(S)锁。另一方面,偏向于换取的事项将更新(U)、意向互斥(IX)和互斥(X)锁用于表,将共享(S)、更新(U)和互斥(X)锁用于行。换取事项往往运意图向互斥(IX)和/或互斥(X)锁,而游标节制的事项往往运意图向互斥(IX)和/或互斥(X)锁。

当 SQL 语句预备实行时,DB2 优化器研讨各种满足该语句哀告的步调,并估计每种步调所触及的实行本钱。然后,DB2 优化器按照这一评价选择它感受最优的拜候规划(拜候规划指定满足 SQL 哀告所需的操纵,以及实行这些操纵的按次)。拜候规划可以运用两种步调之一来拜候表中的数据:经过间接地读取表(称为实行关系扫描);或经过读取该表上的索引,然后检索特定索引项所援用的表行(称为实行索引扫描)。

DB2 优化器选择的拜候路子(往往是按照数据库的阴谋确定的)会对所获取锁的数量和所运用的锁形态孕育发生明显的影响。比方,当运用索引扫描来查找特定行时,DB2 数据库管理按次极有可以或许获取一个或多个意向共享(IS)行级锁。但是,假设运用表扫描,由于必须依次扫描整个表来找到特定行,所以 DB2 数据库管理按次可以或许会选择获取单个共享(S)表级锁。




版权声明: 原创作品,允许转载,转载时请务必以超链接方式标明文章 原始来由 、作者信息和本声明。否则将追究法令责任。

原文地址:https://www.cnblogs.com/zgqjymx/p/1972942.html