DB2 死鎖的根本原因和負責資源調查
問題:一個 COBOL-DB2 程式由於死鎖而失敗。您將如何找到導致程式失敗的資源?
解決方案
當兩個或多個應用程式發生死鎖時,它們會互相等待對方釋放其所需的資源上的鎖。在 DB2 系統作業 DSNZMSTR 作業中可以找到詳細的資訊和日誌。DSNZ 是已安裝的 DB2 子系統的名稱,它因安裝而異。此作業的 SYSOUT 繼續顯示 DB2 級別的系統日誌。與死鎖相關的日誌也存在於此作業中。
首先,我們需要找出我們的 COBOL-DB2 程式因死鎖而失敗的時間。接下來,我們將檢查該特定時間段內 MSTR 作業的 SYSOUT。
我們將獲得死鎖資訊,例如:參與死鎖的 COBOL-DB2 程式/事務/程序、發生死鎖的 DB2 資源等。
讓我們看一個死鎖條件的例子。
考慮以下 ORDERS 和 TRANSACTIONS DB2 表。
訂單 ID | 訂單日期 | 交易 ID |
Z22345 | 22-10-2020 | IRN11236 |
Z62998 | 14-09-2020 | IRN77812 |
Z56990 | 01-09-2020 | IRN89023 |
Z56902 | 21-09-2020 | IRN09663 |
Z99781 | 12-08-2020 | IRN88112 |
Z56112 | 30-10-2020 | IRN67091 |
交易 ID | 交易金額 |
IRN11236 | 6754 |
IRN77812 | 451 |
IRN89023 | 9087 |
IRN09663 | 1156 |
IRN88112 | 5908 |
IRN67091 | 152 |
如果有兩個程式當前處於執行階段——PROG A 和 PROG B。PROG A 正在讀取 TRANSACTIONS 和 ORDERS DB2 表,並持有這兩個表上的共享鎖。PROG B 也正在讀取 TRANSACTIONS 和 ORDERS DB2 表,並且也持有這兩個表上的共享鎖。
PROG A 需要更新 ORDERS 表,因此它將把其共享鎖提升到更新鎖,然後它將等待 PROG B 從 ORDERS 表釋放其共享鎖,以便更新鎖可以提升到獨佔鎖。
同時,PROG B 需要更新 TRANSACTIONS 表,因此它將把其共享鎖提升到更新鎖,並將等待 PROG A 從 TRANSACTIONS 表釋放其共享鎖,以便將其鎖從更新提升到獨佔。
在上述場景中,PROG A 和 PROG B 正在等待對方釋放鎖,但實際上它們被卡住了並進入了一個稱為死鎖的狀態。
廣告