科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道DB2通用数据库的并发性

DB2通用数据库的并发性

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

并发性是数据库管理系统具有的一种功能,用以允许多个用户同时访问数据,同时维护数据的完整性和一致性。本文针对在 DB2 for z/OS 环境中提供并发性,提供了一些通用指南和建议。

来源:IT专家网 2008年6月6日

关键字: IBM 数据库 DB2

  • 评论
  • 分享微博
  • 分享邮件

以一致次序访问数据

在多数环境中,时常会发生不同的应用程序需要访问同一数据的情况。要在您的环境中规定应用程序以相同的次序访问数据。例如,要求所有应用程序按升序访问表 XYZ 中各行。如果那样,第一个访问表 XYZ 的应用程序就可能会延迟其他应用程序,但不会导致死锁的状况。以类似的方式,所有访问表 A、B 和 C 的应用程序都应按字母顺序来进行访问。

增加联机并发性

减少死锁和超时的一种方法就是按照上面所描述的,在整个系统中按照一致次序来访问 DB2 UDB 数据。而第二种方法则是在 UPDATE 和 DELETE 上使用 WHERE CURRENT OF 游标选项,而不是使用独立的 UPDATE 和 DELETE 语句。在争取获得联机 DB2 UDB 数据的最大并发性时,考虑的第三种选择就是在非活动或非高峰 OLTP 时期,尝试为联机表计划批处理活动。

参照约束

在 DB2 UDB 数据库中使用参照约束可以带来性能影响。父表中某行上的 DELETE 语句需要获取子表(或者,至少是其索引)上的锁。那么,那些子表的并发使用的可用性会由于那些锁而减小。该影响对于级联删除可能相当大,因为访问单行的单个删除操作可能需要扫描多个表中的多行数据。

您经常可以通过在外键上创建索引来减小性能影响。虽然并不强制外键上有索引,但是若不存在该索引,那么当从父表中删除一行时,DB2 UDB 就必须扫描整个子表。

可以潜在地改进该状况的另一个动作必须与组合相关表有关。如果频繁删除父表中的行,则可以考虑将所有的子表(以及它们的子表)置于同一表空间中。

BIND 选项

将“源” SQL(实际上就是准备好的 DBRM)转换成可执行代码的过程称作绑定,在某些方面类似于 COBOL 等过程语言的编译/链接-编辑过程。在绑定 SQL 代码时,可以指定许多选项,而这些选项可以极大地影响应用程序将经历的并发性程度。下面讨论了一些影响并发性的重要选项。

  • ACQUIRE

参数 ACQUIRE 决定 DB2 UDB 用以获得应用程序所请求数据上的锁的时间。ACQUIRE(ALLOCATE) 指示 DB2 UDB 在分配应用程序计划时获取所有所需的表空间锁,但 ACQUIRE(USE) 将使 DB2 UDB 等到应用程序首次向该表发出 SQL 语句时,才获取那些锁。

您通常应该用 ACQUIRE(USE) 选项(这是包绑定的默认选项)来绑定计划。那通常也是并发性的最佳选择。ACQUIRE(ALLOCATE) 选项可以更好地保护优先级极高的作业免于死锁。为了偶尔适当地使用该选项,您可能需要考虑将所有 DBRM 直接绑定到该计划。

  • RELEASE

DB2 UDB 释放它所持有的锁的时间是由 RELEASE 选项决定的。通过 RELEASE(COMMIT),DB2 UDB 指示 IRLM 在到达 COMMIT 点时释放锁,而通过 RELEASE(DEALLOCATE),DB2 UDB 将保留所有锁,直到终止程序并释放计划。

虽然不一定适用于所有状况和环境,但通常的建议是将 RELEASE(COMMIT) 用于 OLTP 应用程序,以及其他请求相对少量锁和应用程序进程的经过时间相当短的应用程序。对于批处理应用程序进程以及其他获取大量锁且/或执行时间长的应用程序进程来说,RELEASE(DEALLOCATE) 通常为更好的性能选项。

ACQUIRE/RELEASE 组合

对于 BIND 的 ACQUIRE/RELEASE 选项的通用建议是基于应用程序的特点选择组合值。有一种组合,即 ACQUIRE(ALLOCATE)/RELEASE(COMMIT) 是不允许的。DB2 BIND 进程会将该种说明标记为错误。其他三种可能的组合都有其合适的用法,下面将简要地进行描述。

  • ACQUIRE(ALLOCATE)/RELEASE(DEALLOCATE)

ACQUIRE(ALLOCATE)/RELEASE(DEALLOCATE) 可能对于运行几小时并访问不同表的批应用程序十分有用,因为该组合将有效地阻止死锁状况损耗一切处理。一开始运行程序,应用程序就会锁定所有所需资源。

该组合的不足就是它可能严重地减小并发性。 潜在地具有较高需求的资源的锁定时间可能比实际所需要长。同时,请注意 ACQUIRE(ALLOCATE) 禁用选择性的分区锁定,以至于如果您访问用 LOCKPART YES 定义的表空间,将会锁定所有分区。

  • ACQUIRE(USE)/RELEASE(DEALLOCATE)

ACQUIRE(USE)/RELEASE(DEALLOCATE) 组合通常导致最为高效地使用处理时间。DB2 UDB 资源仅在应用程序需要它们时才被锁定。这样就减小了锁开销,因为在那之后,会将所获取的锁保留到终止应用程序之时。

该组合的不足就是相较于 ACQUIRE(ALLOCATE) 时,它可能导致更频繁地发生死锁状况。只有在实际的应用程序运行时,才按可预测的次序这样来作用所获取的锁。因此,可能发生更多死锁。

  • ACQUIRE(USE)/RELEASE(COMMIT)

ACQUIRE(USE)/RELEASE(COMMIT) 碰巧就是 BIND 的默认组合,提供了最佳的并发性。DB2 UDB 资源仅在应用程序需要它时才被锁定,如果该应用程序包含许多不常使用的 SQL 语句,这就可能极其重要。

然而,其权衡就是,如果应用程序相当频繁地提交,就可能增加处理时间,那么该应用程序就必须再次重新获取锁。与上面的 ACQUIRE(USE)/RELEASE(DEALLOCATE) 组合一样,也可能增加死锁,因为只有在执行实际的程序时,才按可预测的次序获取所有的锁。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章