发生死锁时如何递归调用过程?

How to recursively call a procedure when there is a deadlock?

我有工作 "stored procedures" 运行 过夜。我时不时 运行 陷入僵局。我想编写一个代码,如果发现死锁,将在 15 分钟后最多执行 3 次相同的过程。

假设现在时间是上午 10 点。然后 运行 它在上午 10 点,如果发现死锁,在 10:15AM 再次调用作业,然后在 10:30AM "if dead locked",然后 10:45AM "if dead locked."如果最后一个 运行 死锁则完全终止作业。

这是我所做的。

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;

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

我会保留过程中的所有内容:然后与此行为相关的所有代码都在一个位置。另外:死锁不会跟随你的 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;

你将不得不测试这个:未经测试,所以错别字并非不可能。