2015-06-19 65 views
0

我有工作「存儲過程」運行過夜。我偶爾會陷入僵局。如果發現死鎖,我想編寫一個代碼,在15分鐘之後執行相同的過程,直到3次。如何在存在死鎖的情況下遞歸調用過程?

假設現在的時間是上午10點。然後在上午10點運行,如果發現死鎖,請在上午10:15再次致電作業,然後在上午10:30「如果已鎖定」,則在上午10:45「如果已鎖定」。如果上次運行死鎖,則完全終止作業。

這是我所做的。

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; 

這是一個有效的方法嗎?除了消除死鎖之外,還有更好的方法嗎?

+0

你必須添加一個循環 –

+0

如果我將totalTrys和一個參數傳遞給過程? – Jaylen

+0

你可以做到這一點,但是這部分不在這裏:) –

回答

0

我會在程序中保留所有內容:然後所有與此行爲相關的代碼都在一個位置。另外:僵局會不會跟隨你的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; 

你將不得不測試:未經檢驗的,所以錯別字是不可能的。

相關問題