Heim  >  Fragen und Antworten  >  Hauptteil

Wie rufe ich ein Programm rekursiv auf, wenn ein Deadlock auftritt?

<p>Mein Job „Gespeicherte Prozedur“ läuft über Nacht. Hin und wieder bleibe ich stecken. Ich möchte einen Code schreiben, der bei einem Deadlock den gleichen Prozess nach 15 Minuten bis zu dreimal ausführt. </p> <p>Angenommen, es ist 10 Uhr. Führen Sie ihn dann um 10 Uhr aus. Wenn ein Deadlock gefunden wird, rufen Sie den Job erneut um 10:15 Uhr auf, dann um 10:30 Uhr „bei Deadlock“ und dann um 10:45 Uhr „bei Deadlock“. Wenn es beim letzten Lauf zu einem Deadlock kommt, beenden Sie den Job vollständig. </p> <p>Das habe ich getan. </p> <pre class="brush:php;toolbar:false;">DECLARE totalTrys INT DEFAULT 0; EXIT-HANDLER FÜR SQLEXCEPTION ERKLÄREN BEGINNEN ERHALTEN SIE DIAGNOSEBEDINGUNG 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(); ENDE WENN; ENDE;</pre> <p>Ist das ein effizienter Ansatz? Gibt es einen besseren Weg, als den Deadlock zu beseitigen? </p>
P粉060112396P粉060112396416 Tage vor479

Antworte allen(1)Ich werde antworten

  • 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;

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

    Antwort
    0
  • StornierenAntwort