Maison  >  Questions et réponses  >  le corps du texte

Comment appeler un programme de manière récursive en cas de blocage ?

<p>La "procédure stockée" de mon travail s'exécute pendant la nuit. De temps en temps, je reste coincé. Je veux écrire un code qui, si un blocage est trouvé, exécutera le même processus jusqu'à 3 fois après 15 minutes. </p> <p>Supposons qu’il soit 10 heures du matin. Exécutez-le ensuite à 10h et si un blocage est trouvé, rappelez le travail à 10h15, puis à 10h30 "si blocage", puis à 10h45 "si blocage". Si la dernière exécution se bloque, terminez complètement le travail. </p> <p>C'est ce que j'ai fait. </p> <pre class="brush:php;toolbar:false;">DÉCLARE totalTrys INT DEFAULT 0; DÉCLARER LE MANIPULATEUR DE SORTIE POUR SQLEXCEPTION COMMENCER OBTENIR LE DIAGNOSTIC CONDITION 1 @err_num = MYSQL_ERRNO ; if (@err_num = 1213 ET totalTrys < 4) ALORS SET totalTrys = totalTrys + 1 ; SÉLECTIONNEZ LE SOMMEIL (900); APPEL guardi.prod_update_guardi_accounts(); FIN SI; FIN;≪/pré> <p>Est-ce une approche efficace ? Existe-t-il un meilleur moyen que d’éliminer l’impasse ? </p>
P粉060112396P粉060112396416 Il y a quelques jours481

répondre à tous(1)je répondrai

  • P粉649990163

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

    Je garderais tout en cours : alors tout le code lié à ce comportement est au même endroit. Aussi : le blocage ne suivrait-il pas l'exécution de votre instruction CALL au lieu de continuer ? Si nous continuons, le problème aura peut-être été résolu et nous n'attendrons plus rien. De plus, les transactions suivant un blocage ne seront exécutées qu’une fois le blocage résolu.

    Mon approche de votre code est la suivante :

    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;

    Vous devrez tester ceci : non testé, donc les fautes de frappe ne sont pas impossibles.

    répondre
    0
  • Annulerrépondre