并行性

并行 是使多个用户能够同时访问和更改同一表或视图中的数据,而不会有丢失数据完整性的风险。

此功能由 Db2 for i 数据库管理器自动提供。 将隐式获取对表和行的锁定,以保护并发用户在完全相同的时间更改相同的数据。

通常, Db2 for i 获取对行的锁定以确保完整性。 但是,某些情境要求 Db2 for i 获取更互斥的表级别锁定,而不是行锁定。

例如,一个游标当前持有的行上的更新 (互斥) 锁定可以由同一程序中的另一个游标获取 (或者在与该游标无关的 DELETE 或 UPDATE 语句中)。 这将阻止引用第一个游标的定位 UPDATE 或定位 DELETE 语句,直到执行另一个 FETCH。 对当前由一个游标持有的行的读 (共享无更新) 锁定不会阻止同一程序 (或 DELETE 或 UPDATE 语句) 中的另一个游标获取对同一行的锁定。

支持缺省值和用户指定的锁定等待超时值。 Db2 for i 使用缺省记录等待时间 (60 秒) 和缺省文件等待时间 (*IMMED) 创建表,视图和索引。 此锁定等待时间用于数据操作语言 (DML) 语句。 可以使用 CL 命令 "更改物理文件" (CHGPF) , "更改逻辑文件" (CHGLF) 和 "覆盖数据库文件" (OVRDBF) 来更改这些值。

用于所有数据定义语言 (DDL) 语句和 LOCK TABLE 语句的锁定等待时间是作业缺省等待时间 (DFTWAIT)。 可以使用 CL 命令 "更改作业" (CHGJOB) 或 "更改类" (CHGCLS) 来更改此值。

如果指定了较大的记录等待时间,那么将提供死锁检测。 例如,假定一个作业对行 1 具有互斥锁定,而另一个作业对行 2 具有互斥锁定。 如果第一个作业尝试锁定行 2 ,那么它将等待,因为第二个作业正在挂起锁定。 如果第二个作业随后尝试锁定行 1 ,那么 Db2 for i 会检测到这两个作业处于死锁状态,并且会向第二个作业返回错误。

您可以使用 SQL LOCK TABLE 语句来显式阻止其他用户同时使用表。 使用 COMMIT (*RR) 还将阻止其他用户在工作单元期间使用表。

为了提高性能, Db2 for i 经常使开放式数据路径 (ODP) 保持打开状态。 此性能功能还会保留对 ODP 引用的表的锁定,但不会保留对行的任何锁定。 对表的剩余锁定可能会阻止另一个作业对该表执行操作。 但是,在大多数情况下, Db2 for i 可以检测到其他作业持有锁定,并且可以向这些作业发出事件信号。 该事件会导致 Db2 for i 关闭与该表相关联的任何 ODP (并释放表锁定) ,并且当前仅出于性能原因而打开这些 ODP。

注意:锁定等待超时必须足够大,以便事件发出信号和其他作业关闭 ODP,否则将返回错误信息。

除非使用 LOCK TABLE 语句来获取表锁定,或者使用 COMMIT (*ALL) 或 COMMIT (*RR) ,否则一个作业读取的数据可由另一个作业立即更改。 通常,在执行 SQL 语句时读取的数据,因此它是非常最新的 (例如,在 FETCH 期间)。 但是,在以下情况下,在执行 SQL 语句之前会读取数据,因此数据可能不是最新的 (例如,在 OPEN 期间)。

  • 指定了 ALWCPYDTA (*OPTIMIZE) ,并且优化器确定生成数据副本的性能优于不生成副本的性能。
  • 某些查询需要数据库管理器来创建临时结果表。 临时结果表中的数据不反映打开游标后所作的更改。 有关何时创建临时结果表的信息,请参阅 SQL 参考主题集合中的 DECLARE CURSOR
  • 打开查询时,将对基本子查询进行求值。

并发访问解析选项可用于最小化事务等待时间。 此选项指示数据库管理器如何处理特定隔离级别下的记录锁定冲突。

并发访问解析选项可以具有下列其中一个值:
等待结果
这是缺省情况。 此值指示数据库管理器在迂到正在更新或删除的锁定数据时等待落实或回滚。 不会跳过正在插入的锁定行。 当在 COMMIT (*CS) 或 COMMIT (*RS) 下运行时,此选项适用于只读查询,否则将被忽略。
使用当前落实的数据
此值允许数据库管理器在迂到与未落实的更新和删除相关的 行锁定争用时,将当前已落实的数据版本用于只读查询。 可以跳过插入过程中的锁定行。 当在 COMMIT (*CS) 下运行时,此选项在可能的情况下适用,否则将被忽略。 如果找不到先前落实的数据版本,那么并发访问解析行为将缺省为等待结果。
跳过锁定的数据
此值指示数据库管理器在发生记录锁定冲突时跳过行。 仅当查询在 COMMIT (*CS) 或 COMMIT (*ALL) 下运行时,此选项才适用。

USE CURRENT COMMITTED 和 SKIP LOCKED DATA 的并发访问解析值可用于通过避免锁定等待来提高并行性。 但是,使用这些选项时必须小心,因为它们可能会影响应用程序功能。 有关如何指定并发访问解析选项的详细信息,请参阅 通过避免锁定等待来提高并行性

使用当前已落实的详细信息和注意事项

要查找先前已落实的行版本,数据库管理器将根据相对记录号在日志中搜索最近已落实的行映像。 日志搜索可能找不到行,或者搜索可能超时。 最大记录等待时间 (WAITRCD) 会影响数据库管理器在失败之前搜索的时间长度。 可以使用 "更改物理文件" (CHGPF) 命令来更改文件的 WAITRCD。

可视说明可用于了解 "使用当前已落实的查询" 的实现。 提供了以下详细信息:
  • 当前已落实的日志搜索时间限制-允许在日志中搜索当前已落实的行版本的最大时间量。
  • 当前已落实的日志搜索请求数-数据库管理器在日志中搜索当前已落实的行版本的次数。
  • 当前已落实的日志搜索失败数-数据库管理器在日志中找不到当前已落实的行版本的次数。 对于未找到当前已落实版本的每行,将执行等待。