DB2 9 哄骗开荒(733 考试)认证指南,第 8 局部: 低级编程(7)

用户定义的数据类型、并发性思索要素等等
developerWorks








运用 DB2 数据库并发性

DB2 并发性

每个数据库法度员都应该明确数据库并发性是如何使命的。通通 RDBMS 都遵照地方数据库数据无缺性绳尺,但是它们在如那处理锁定、事情和并发性节制方面有很年夜分歧。经由历程学习更多关于 DB2 并发性的内容,可以防止错误和并发性题目,还能够仅用大批的修正年夜年夜提高哄骗法度性能。

为了防止当前会搅浑,先定义一些术语是很是首要的:

  • 中断中断级别(Isolation level):DB2 运用中断中断级别来维护和节制数据库中数据的无缺性。中断中断级别定义历程受维护(或中断中断)的程度,以防止当它们还在数据库中实行时遭到其他哄骗法度所做修正的影响。中断中断级别是由每个哄骗法度指定的。这意味着,邻接同一数据库的多个哄骗法度能够运用差此外中断中断级别。

  • 锁形式(Lock mode):这透露表现答应锁拥有者实行的造访类型,以及对被锁定器械举办造访的并发用户所答应的造访类型。偶尔分,这也称作锁的 “形态(state)”。

  • 归天锁(Deadlock):当邻接同一数据库的两个或更多历程无期限地等待完成事情所需的资源时,就会迸发归天锁。这种等待形态会不时延续下去,由于每个历程都拥有其他历程所需的资源。

  • 锁晋级(Lock escalation):假设由于锁内存空间缺乏,或许抵达了锁分配阈值,同一个表上的多个行锁转换为单个表锁,就是迸发了锁晋级。






回页首



中断中断级别

DB2 支撑四种中断中断级别。下面列出了这些中断中断级别,遵照提供最小的数据维护程度到提供最年夜的数据维护级别顺次分列。

  1. 未提交读(Uncommitted Read,UR)。未提交读是最弱的中断中断级别,提供起码的数据维护。在运用未提交读时,在使命单元实行历程中可以读取任何行,即使它正被另一哄骗法度历程修正。这意味着,您的哄骗法度能够前往由于另一哄骗法度的事情回滚而不再无效的数据。运用 UR 能够招致读取不精确的数据或陈旧的数据,这就是它偶尔称作脏读(dirty read) 的原因。

    用法:UR 在年夜型数据客栈系统中极端无效,在这种系统中不但愿由于等待几个行锁而制止操纵。UR 常常用于生成报表,如答应以防止遭到数据库中锁处理的影响。

  2. 游标稳固性(Cursor Stability,CS)。游标稳固性是默许的和最常用的中断中断级别。CS 持有游标当前地点的行上的锁。这确保当读取或变动该行时,另一历程无法修正它。该即将被不时锁定,直到读取新的一行,或直到制止或完成该使命单元。

    假设更新了任何行,那么该锁将延续到提交或回滚该使命单元。CS 中断中断级别不前往未提交的数据。

    用法:CS 中断中断级别是最常用的,由于它确保不读取当前被锁定的行;它还锁定您正在读取的行。由于这种锁只节制当前处理的行,以是竞争极小且增加了锁定,但是仍然实施了数据维护。良多事情处理系统都运用这个中断中断级别。

  3. 读稳固性(Read Stability,RS)。读稳固性中断中断级别会锁定哄骗法度在使命单元(UOW)期间检索的通通行,无论它们能否被更新了。这确保它所运用的所稀有据都无法被变动,并保证后果集在 UOW 期间贯穿跟尾颠簸。RS 级别确保其他哄骗法度无法修正在使命单元期间前往或运用的数据。

    用法:这个中断中断级别提供更高的数据维护,由于由究诘前往的通通行在 UOW 期间都被锁定。但是,它极年夜地添加了被持有的锁的数量,并能够消沉并发性。

  4. 可反复读(Repeatable Read,RR)。这是最强的中断中断级别,它提供最年夜程度的数据无缺性。它将锁定使命单元期间处理的通通行。这意味着没有在后果会合前往的行也会被锁定,直到提交或制止该使命单元。这会给并发性带来极年夜的负面影响,由于在运用这个中断中断级别时整个表通常都被锁定。但是,假设在一个使命单元期间反复一个究诘,那么它确保前往完全相同的后果。运用这个中断中断级此外最年夜缺陷就是优化器通常要给与表锁,这抱负上会克制其他哄骗法度处理被锁定表上的究诘。

    用法:假设究诘在同一 UOW 中每次实行都必需前往完全相同的后果集,就运用这个中断中断级别。






回页首



稀有的数据无缺性题目

DB2 的中断中断级别系统用于防止数据被其他哄骗法度修正或造访,从而防止数据无缺性题目。在这一节中,将明确一些窜伏的数据无缺性题目。

脏读

当可以读取未提交的数据时能够会呈现 “脏读”,由于假设这些数据的修正被回滚,就会招致在数据处理中运用无效数据。

图 5 中说明白这种场景。在这里,更新了一行并变动了 P-name 字段,但是没有提交。然后,另一个运用 UR 中断中断级此外哄骗法度实行 SELECT 语句。由于 UR 马虎行上的锁,以是它将前往未提交的值。但是,更新事情在被提交之前被回滚。因此,SELECT 语句前往错误的值。

图 5. 读取了未提交的数据
读取了未提交的数据

不可反复读

假设一个究诘在同一使命单元中前往差此外后果集,就是呈现了 “不可反复读”。图 6 中说明白这种场景。假定哄骗法度 A 查找从 Dallas 到 Honolulu 的通通航班,哄骗法度 B 在 flight 表中删除了一个航班,由于这个航班被消除了。假设哄骗法度 A 在它的事情中再次实行异样的究诘,就不会得到完全相同的数据集:个中不包括消除的阿谁航班。由于在哄骗法度 A 运转其事情时,答应哄骗法度 B 变动这个表,这个究诘将是不可反复的。

图 6. 不可反复读
不可反复读示例

幻像读

假设哄骗法度在一个事情中实行同一 SQL 语句频频,而且后续实行会前往附加行,就是迸发了 “幻像读”。

图 7 中说明白这种场景。假定哄骗法度 A 究诘 512 航班的通通空隙座位,发明只要一个座位空着。在此之后,由于一位搭客消除了灰机票,哄骗法度 B 消除了这个航班上一个座位的预订。假设哄骗法度 A 在这个事情中再次实行同一究诘,那么它不会得到完全相同的数据集 —— 会呈现新的座位。

图 7. 幻像读
幻像读






回页首



数据无缺性维护

并非通通哄骗法度城市遭到前一节所列题目标陵犯。抱负上,在特定的哄骗法度中个中某些并发场景能够是可以肩负负责的。但是,必定要明确中断中断级别之间的分歧,并在满足自身哄骗法度需求的形态下,选择限制起码的中断中断级别。假设以为哄骗法度中能够迸发这些场景,那么应该知道哪些中断中断级别可以防止它们。表 1 可以帮手您做出决定。

表 1. 运用每个中断中断级别可以防止的并提题目

中断中断级别 读取未提交数据 不可反复读 幻像读
可反复读 不大要 不大要 不大要
读稳固性 不大要 不大要 能够
游标稳固性 不大要 能够 能够
未提交读 能够 能够 能够






回页首



锁晋级

DB2 经由历程称为 LOCKLIST 的内存区域来跟踪哄骗法度历程所持有的通通锁。每个锁占用大批的内存,以是数据库很少会用完 LOCKLIST 内存。但是,假设用完了内存,一些锁将会被晋级。这触及到将一个表上的良多行锁换成单个表锁。表锁能够招致并发性题目,由于哄骗法度锁定整个表,使其他哄骗法度无法更新这个表中的任何行。

图 8. 锁晋级表示图
锁晋级表示图

在 图 8 中,上图说明白哄骗法度超过答应它具有的总的锁内存百分比(MAXLOCKS 值)的形态。因此,数据库实行锁晋级,将哄骗法度的锁内存百分比消沉到 MAXLOCKS 指定的百分比之下。下图说明白更为稀有的形态:抵达总的锁内存限制,因此实行锁晋级来释放锁内存。

锁晋级题目可以经由历程添加 LOCKLISTMAXLOCKS 数据库参数的年夜小来打点。但是,假设仍然碰到锁定题目,很能够应该搜查能否未能提交事情,从而未释放已更新行上的锁。





回页首



共享锁和排他锁

固然 DB2 运用良多分歧类型的锁,但是明确锁定是如何使命的以及明确最常用的锁类型是最首要的。锁形式(lock mode) 是答应锁通通者实行的造访类型,以及答应并发哄骗法度在被锁定器械上实行的造访类型。

两种首要的锁类型是排他(exclusive)共享(share) 锁。共享锁(或称为 S 锁)是在要举办读操纵的行上设置的;当读取该行时,它们防止该行被删除或变动。一旦不再读该行了,就释放这个锁,可以对它加以变动。排他锁(或称为 X 锁)是在被更新、删除或拔出的行上设置的。排他锁防止该行被读取或更新,直到提交或回滚该事情为止。如许的话,另一个哄骗法度就不会读取未提交的数据。请记着,中断中断级别也用来节制持有锁多长时间以及锁的使命编制。比方,在未提交读中断中断级别下运转的哄骗法度可以年夜约读取设置了排他锁的行。

通通的锁类型城市被持有它们的哄骗法度马虎,由于这些锁只用于防止其他哄骗法度修正或造访由持有该锁的哄骗法度所修正的数据。





回页首



锁形式兼容性

锁形式以差此外编制相互举办交互。可以在 DB2 文档中找到锁类型的无缺列表。下面的列表包括最常用的锁类型的精确定义以及每种类型在何时呈现的刻画。

以下列表总结了最首要的锁类型。

行锁

  • Share:出如今运用 SELECT 语句读取数据期间。
  • Update:出如今运用游标和 FOR UPDATE 子句更新行时。
  • Exclusive:出如今拔出、更新或删除一行时。

表锁和表空间锁

  • Intent none:持有它的哄骗法度只能读取数据,包括未提交的数据;其他哄骗法度可以读取和更新该器械。
  • Intent share:持有它的哄骗法度只能读取数据,其他哄骗法度可以读取和更新该器械。
  • Intent exclusive:该锁的通通者可以读取和更新数据,其他哄骗法度也可以。
  • Update:该哄骗法度可以举办更新。其他哄骗法度可以读取数据,但是不克不及试图更新它。
  • Exclusive:该锁的通通者可以读取和修正该器械。假设其他哄骗法度运用的是未提交读中断中断级别,才可以读取被锁定的数据。

图 9 总结了分歧锁类型之间的兼容性。关于这里运用的缩写的更多信息,请参阅 DB2 文档。

图 9. 锁兼容性表
锁兼容性表






回页首



归天锁

“归天锁” 是一种并发性题目,当两个哄骗法度相互持有对方所需的资源上的锁时,就会迸发归天锁。这两个哄骗法度将无期限地等待另一个哄骗法度释放所需资源上的锁,这会招致哄骗法度挂起。

当抵达指定的锁超时值时,等待锁的哄骗法度贯穿跟尾并回滚其事情,这时归天锁就可以结束。假设 DB2 归天锁守护历程检测出归天锁,也可以打扫失世锁,这个守护历程是一个按指定的工夫隔断运转并搜查系统中能否存在归天锁的异步历程。归天锁守护历程会选择回滚哪个历程,这会招致释放这个事情的锁,让归天锁触及的另一个哄骗法度可以年夜约得到锁并完成其事情。

增加归天锁

经由历程将数据库锁超时参数(LOCKTIMEOUT)或 CURRENT LOCK TIMEOUT 出格寄放器设置为更短的隔断,可以增加碰到的归天锁数量。这确保哄骗法度不会等待太长的工夫,但是这仍然能够无法完全打点归天锁题目。此外,还可以增加归天锁搜查守护历程被激活的工夫隔断(经由历程 DLCHKTIME 数据库参数)来提高搜查归天锁的频率。不外,一般不举荐如许做,由于假设举办了大批的锁定,那么该守护历程就会斲丧大批的 CPU 工夫。





回页首



增加锁等待和防止归天锁

通常,可以经由历程稍微变动哄骗法度处理数据和事情的编制来完全防止归天锁或锁等待。

提交事情

锁竞争的最年夜原因之一就是未能提交事情,包括只读事情。假设事情未提交或回滚,它的锁将继承留存在它所处理的通通器械上。跟着工夫的推移,这能够招致良多与其他哄骗法度的竞争。因此一旦完成一个营业使命单元,就应该收回 COMMIT 语句。假设一组 SQL 语句不依赖于前一组的后果,而且一组 SQL 语句的失败将不影响另一组的后果,那么它们很能够为两个自力的事情。经由历程在它们之间安置 COMMIT 语句,释放第一组 SQL 语句中的锁,这可以减小其他哄骗法度必需等待它们的能够性。

数据竞争

假设一个哄骗法度试图锁定已被另一个哄骗法度锁定的资源,就会迸发锁竞争。偶尔分,锁竞争和它们招致的锁等待是无法防止的。但是,偶尔分锁竞争是由于 DB2 在太多的行中举办读取招致的,而这由于表上不存在索引或许请求数据的哄骗法度未运用索引招致的。短少相宜的索引会招致 DB2 实行表扫描,这意味着 DB2 必需等待已被另一个哄骗法度锁定的行,即使这些行未包括在该事情中。偶尔分,难以检测哄骗法度的方案能否可以防止数据竞争,只是却缺乏哄骗法度需求的索引。

锁题目标迸发通常是由于持有排他锁的事情没有提交。假设碰到锁定题目,应该查找姑且运转的已修正了数据但却未提交的事情。然后,思索能否可以将那些事情分红多个事情,并在小型事情之间实行 COMMIT 语句来释放一些锁。





回页首



锁防止

为了提高并发性,DB2 如今在某些形态下答应将 CS 或 RS 中断中断扫描的行锁延迟到一个已知满足究诘谓词的记录。在默许形态下,当在表或索引扫描期间实行行锁定时,DB2 在确定该行能否满足该究诘之前,锁定所扫描的每一行。为了提高扫描的并发性,可以将行锁定延迟到 DB2 确定了满足究诘的行。此外,还可以让扫描无前提地跳过已删除或拔出但未提交的记录。

为了行使这些顺从,可以启用 DB2_EVALUNCOMMITTEDDB2_SKIPINSERTEDDB2_SKIPDELETED 注册表变量。更多信息请参考 参考质料 一节中的文章 “Lock avoidance in DB2 UDB V8”。




版权声明: 原创作品,答应转载,转载时请务必以超链接方式标明文章 原始因由 、作者信息和本声明。不然将清查规矩责任。

posted @ 2011-03-06 23:46  蓝色的天空III  阅读(455)  评论(0编辑  收藏  举报