Rumah  >  Soal Jawab  >  teks badan

Bagaimana untuk memanggil program secara rekursif apabila kebuntuan berlaku?

<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粉060112396P粉060112396416 hari yang lalu478

membalas semua(1)saya akan balas

  • P粉649990163

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

    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.

    balas
    0
  • Batalbalas