DB2 数据库中的死锁

调整数据库以减少磁盘 I/O 争用有助于减少死锁,但死锁可能仍然比较常见,new_edit_state 存储过程调用会锁死调用应用程序并使得对 ArcSDE 数据库的所有其他使用停滞。

假设一个情景,其中存储过程在 STATE_LINEAGES 表上获得了大量的行锁,超出了最大锁数阈值并试图升级到排他表锁。不幸的是,调用应用程序的查询已经在 STATE_LINEAGES 表上具有了一个共享锁,这会导致死锁。大量的行锁由于具有较深的状态谱系而产生。这一点再加上锁列表大小的设置较低就会导致问题产生。如果给定锁升级的处理方式,则还可能出现其他死锁情形。

造成的影响是死锁在某些地方可能并不少见,具体取决于其应用程序和数据库配置。请再次注意,这一问题可能因为较深的状态谱系变得更加突出。

幸运的是,IBM DB2 提供了多个调整参数来对以下内容进行控制:锁定列表的大小 (LOCKLIST)、应用程序可保存的锁的最大百分比 (MAXLOCKS)、获取锁的请求需等待的时间量 (LOCKTIMEOUT)、死锁检测的频率间隔 (DLCHKTIME) 和死锁回滚行为 (DB2LOCK_TO_RB)。

简而言之,要增加锁列表容量和锁升级阈值,请分别修改 LOCKLIST 和 MAXLOCKS 参数。

DB2 9 中 LOCKLIST 和 MAXLOCKS 的默认值是 AUTOMATIC,可使这些参数进行自我调整。这使得 DB2 的内存调整器可以在不同的内存使用者之间动态调整内存资源的大小。仅在数据库启用了自我调整内存的情况下才会发生自动调整 (SELF_TUNING_MEM=ON)。

另外,您可以使用 DB2 锁定延迟注册表变量 DB2_EVALUNCOMMITED、DB2_SKIPDELETED 和 DB2_SKIPINSERTED 实现锁定避免,从而改善并发状况。这些注册表变量允许通过扫描方式无条件跳过未提交的删除锁定和插入锁定。

默认情况下,锁定超时会回滚请求事务。要将该行为改为只回滚提出锁定请求的语句,则请使用 db2set DB2LOCK_TO_RB=STATEMENT 修改 DB2LOCK_TO_RB。但默认行为应适用于 ArcSDE。

有关正确设置这些参数的详细信息,请参阅 DB2 文档或性能调整指南。下面给出了使用这些参数的概述。

诊断锁定问题

以下是诊断锁定问题的一些有用工具的详细信息。

处理死锁的参数设置

要查看锁定列表设置,请执行以下命令:

db2 get db cfg

以下示例是执行这一命令后作为结果返回的信息:

Max storage for lock list (4KB)		(LOCKLIST) = 50 Interval for checking deadlock (ms)	(DLCHKTIME) = 10000 Percent. of lock lists per application	(MAXLOCKS) = 22 Lock time out (sec)			(LOCKTIMEOUT) = -1 Max number of active applications	(MAXAPPLS) = AUTOMATIC

有关设置这些参数的详细信息,请查阅 IBM DB2 信息中心。


3/7/2012