Wie rufe ich ein Programm rekursiv auf, wenn ein Deadlock auftritt?
P粉060112396
2023-08-30 22:10:39
<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>
我会将所有内容保留在过程中:然后与此行为相关的所有代码都位于一个位置。另外:死锁不会跟随您的 CALL 语句的执行而不是继续执行吗?如果继续进行,那么问题可能已经解决了,那么我们就什么也不等待了。此外,死锁后的事务只会在死锁解决后执行。
我对您的代码的处理方法是:
您必须对此进行测试:未经测试,因此拼写错误并非不可能。