调查导致DB2死锁的根本原因和资源
问题:由于死锁,COBOL-DB2程序失败。您将如何查找由于程序失败而导致的资源?
解
当两个或多个应用程序卡住,彼此等待释放对它们所需资源的锁定时,将发生DEADLOCK条件。可以在DB2系统作业DSNZMSTR作业中找到详细的信息和日志。DSNZ是已安装的DB2子系统的名称,并且因安装而异。该作业的SYSOUT继续显示DB2级别的系统日志。与死锁相关的日志在此作业中也可用。
首先,我们需要找出由于死锁而导致我们的COBOL-DB2程序失败的时间。接下来,我们将在特定时间检查MSTR作业的SYSOUT。
我们将获得死锁信息,例如-死锁中涉及的COBOL-DB2程序/事务/进程,发生死锁的DB2资源等。
让我们看一个死锁情况的例子。
考虑下面的ORDERS和TRANSACTIONSDB2表。
如果当前在执行阶段有两个程序-PROGA和PROGB。PROGA正在读取TRANSACTIONS和ORDERSDB2表,并在两个表上都持有SHARED锁。PROGB还在读取TRANSACTIONS和ORDERSDB2表,并且还在两个表上都持有SHARED锁。
PROGA需要更新ORDERS表,因此它将其SHARED锁升级为UPDATE锁,然后将等待PROGB从ORDERS表中释放其SHARED锁,以便将UPDATE锁提升为EXCLUSIVE锁。
同时,PROGB需要更新TRANSACTIONS表,因此它会将其SHARED锁升级为UPDATE锁,并等待PROGA将其SHARED锁从TRANSACTIONS表中释放,以便将其锁从UPDATE升级为EXCLUSIVE。
在上述情况下,PROGA和PROGB正在等待各自释放锁,但实际上它们被卡住并进入称为死锁的状态。