出現死鎖時如何遞歸呼叫程式?
P粉060112396
P粉060112396 2023-08-30 22:10:39
0
1
531
<p>我的作業「預存程序」整夜運行。我時不時地陷入僵局。我想編寫一個程式碼,如果發現死鎖,它將在 15 分鐘後執行相同的過程最多 3 次。 </p> <p>假設現在時間是上午 10 點。然後在上午 10 點運行它,如果發現死鎖,則在上午 10:15 再次調用該作業,然後在上午 10:30“如果死鎖”,然後在上午 10:45“如果死鎖”。如果最後一次執行死鎖,則完全終止作業。 </p> <p>這是我所做的。 </p> <pre class="brush:php;toolbar:false;">DECLARE totalTrys INT DEFAULT 0; DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN GET DIAGNOSTICS CONDITION 1 @err_num = MYSQL_ERRNO; if(@err_num = 1213 AND totalTrys < 4) THEN SET totalTrys = totalTrys 1; SELECT SLEEP(900); CALL guardi.prod_update_guardi_accounts(); END IF; END;</pre> <p>這是一種有效的方法嗎?除了消除死鎖之外還有更好的方法嗎? </p>
P粉060112396
P粉060112396

全部回覆(1)
P粉649990163

我會將所有內容保留在過程中:然後與此行為相關的所有程式碼都位於一個位置。另外:死鎖不會跟隨您的 CALL 語句的執行而不是繼續執行嗎?如果繼續進行,那麼問題可能已經解決了,那麼我們就什麼都不等待了。此外,死鎖後的交易只會在死鎖解決後執行。

我對您的程式碼的處理方法是:

CREATE PROCEDURE manageAccounts()
BEGIN
DECLARE totalTrys INT DEFAULT 0;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
GET DIAGNOSTICS CONDITION 1
@err_num = MYSQL_ERRNO;
CALL guardi.prod_update_guardi_accounts();
WHILE(@err_num = 1213 AND totalTrys < 4) DO
    SET totalTrys = totalTrys + 1;
    SELECT SLEEP(900);
    CALL guardi.prod_update_guardi_accounts();
END WHILE;
END;

您必須對此進行測試:未經測試,因此拼字錯誤並非不可能。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板