首页  >  问答  >  正文

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

<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粉060112396P粉060112396416 天前484

全部回复(1)我来回复

  • P粉649990163

    P粉6499901632023-08-31 15:04:19

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

    您必须对此进行测试:未经测试,因此拼写错误并非不可能。

    回复
    0
  • 取消回复