Comment appeler un programme de manière récursive en cas de blocage ?
P粉060112396
2023-08-30 22:10:39
<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>
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 :
Vous devrez tester ceci : non testé, donc les fautes de frappe ne sont pas impossibles.