如何在出现死锁时递归调用过程?

时间:2015-06-19 15:56:47

标签: mysql stored-procedures

我有工作“存储过程”运行一夜。我时不时地陷入僵局。我想编写一个代码,如果发现死锁,将在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;

这是一种有效的方法吗?除了一起消除死锁之外还有更好的方法吗?

1 个答案:

答案 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;

你必须测试这个:未经测试,所以拼写错误并非不可能。

相关问题