Bagaimana untuk memanggil program secara rekursif apabila kebuntuan berlaku?
P粉060112396
P粉060112396 2023-08-30 22:10:39
0
1
565
<p>Tugas saya "prosedur tersimpan" berjalan semalaman. Sesekali saya terjebak. Saya ingin menulis kod yang jika kebuntuan ditemui, ia akan melaksanakan proses yang sama sehingga 3 kali selepas 15 minit. </p> <p>Andaikan sudah pukul 10 pagi. Kemudian jalankannya pada pukul 10 pagi dan jika kebuntuan ditemui, hubungi kerja itu semula pada pukul 10:15 pagi, kemudian pada pukul 10:30 pagi "jika kebuntuan", kemudian pada pukul 10:45 pagi "jika kebuntuan". Jika larian terakhir menemui jalan buntu, tamatkan kerja sepenuhnya. </p> <p>Inilah yang saya lakukan. </p> <pre class="brush:php;toolbar:false;">ISYTIHARKAN totalTrys INT lalai 0; ISYTIHKAN PENGENDALI KELUAR UNTUK SQLEXCEPTION BERMULA DAPATKAN SYARAT DIAGNOSTIK 1 @err_num = MYSQL_ERRNO; if(@err_num = 1213 DAN totalTrys < 4) MAKA SET totalTrys = totalTrys + 1; PILIH TIDUR(900); HUBUNGI guardi.prod_update_guardi_accounts(); TAMAT JIKA; TAMAT;</pre> <p>Adakah ini pendekatan yang cekap? Adakah terdapat cara yang lebih baik daripada menghapuskan kebuntuan? </p>
P粉060112396
P粉060112396

membalas semua(1)
P粉649990163

Saya akan memastikan semuanya dalam proses: maka semua kod yang berkaitan dengan tingkah laku ini berada di satu tempat. Juga: bukankah kebuntuan akan mengikuti pelaksanaan pernyataan CALL anda dan bukannya meneruskan? Jika kita meneruskan, maka masalah itu mungkin telah diselesaikan dan kemudian kita tidak menunggu apa-apa. Selain itu, urus niaga berikutan kebuntuan hanya akan dilaksanakan selepas kebuntuan diselesaikan.

Pendekatan saya terhadap kod anda ialah:

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;

Anda perlu menguji ini: belum diuji, jadi kesilapan menaip tidak mustahil.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan