デッドロックが発生したときにプログラムを再帰的に呼び出すにはどうすればよいですか?
P粉060112396
2023-08-30 22:10:39
<p>私のジョブ「ストアド プロシージャ」は夜間に実行されます。時々行き詰まってしまいます。デッドロックを発見した場合、15分後に同じ処理を3回まで実行するコードを書きたいです。 </p>
<p>今が午前 10 時だとします。次に、午前 10 時に実行し、デッドロックが見つかった場合は、午前 10 時 15 分にジョブを再度呼び出します。次に、「デッドロックの場合」午前 10 時 30 分に、次に「デッドロックの場合」午前 10 時 45 分にジョブを呼び出します。最後の実行でデッドロックが発生した場合は、ジョブを完全に終了します。 </p>
<p>これが私がやったことです。 </p>
<pre class="brush:php;toolbar:false;">totalTrys INT DEFAULT 0; を宣言します。
SQLEXCEPTION の終了ハンドラを宣言する
始める
診断条件の取得 1
@err_num = MYSQL_ERRNO;
if(@err_num = 1213 AND totalTrys < 4) THEN
SET totalTrys = totalTrys 1;
SELECT SLEEP(900);
Guardi.prod_update_guardi_accounts() を呼び出します。
終了 IF;
END;</pre>
<p>これは効率的なアプローチですか?デッドロックを解消するより良い方法はあるでしょうか? </p>
私ならプロセス内にすべてを保持します。そうすれば、この動作に関連するすべてのコードが 1 か所に集まります。また、デッドロックは CALL ステートメントの実行を続行せずに実行した後に発生するのではありませんか?続行すれば、問題は解決されている可能性があり、何も待つ必要はありません。さらに、デッドロック後のトランザクションは、デッドロックが解決された後にのみ実行されます。
あなたのコードに対する私のアプローチは次のとおりです:
リーリーこれはテストする必要があります: 未テストなので、タイプミスは不可能ではありません。