Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Sinkronisasi prosedur PL/SQL. Bagaimana menjamin pelaksanaan prosedur hanya satu kali?

Anda dapat menggunakan DBMS_LOCK.request untuk menghasilkan pegangan kunci yang unik. Hanya satu sesi yang dapat menahan kunci ini secara bersamaan. Jika database memulai ulang sesi berakhir secara tidak terduga, kunci akan dilepaskan secara otomatis.

Anda memutuskan saat meminta kunci apakah kunci akan ditahan di seluruh komit atau tidak.

Ini contohnya:

SQL> CREATE OR REPLACE PROCEDURE serial IS
  2     l_lock_handle  VARCHAR2(128 BYTE);
  3     l_lock_request INTEGER;
  4  BEGIN
  5     dbms_lock.allocate_unique(lockname => 'MY_SERIAL_PROC',
  6                               lockhandle => l_lock_handle);
  7     l_lock_request := dbms_lock.request(lockhandle => l_lock_handle,
  8                                         timeout => 5,
  9                                         release_on_commit => FALSE);
 10     CASE l_lock_request
 11        WHEN 0 THEN
 12           NULL; -- success
 13        WHEN 1 THEN
 14           raise_application_error(-20002, 'lock already reserved');
 15        ELSE
 16           raise_application_error(-20001, 'Lock error: ' || l_lock_request);
 17     END CASE;
 18     BEGIN
 19        ---------- serialized block of code           ----------
 20        ---------- (lock will be kept accross commit) ----------
 21        dbms_lock.sleep(30);
 22        ---------- End of serialized code             ----------
 23     EXCEPTION
 24        WHEN OTHERS THEN -- release lock in case of uncatched error
 25           l_lock_request := dbms_lock.release(lockhandle => l_lock_handle);
 26           RAISE;
 27     END;
 28     l_lock_request := dbms_lock.release(lockhandle => l_lock_handle);
 29  END;
 30  /

Procedure created

Saya akan menjalankan dua sesi sekaligus:

Session A> exec serial;                

                                       Session B> -- Before session A ends
                                       Session B> exec serial;

                                       ERROR at line 1:
                                       ORA-20002: lock already reserved
                                       ORA-06512: at "APPS.SERIAL", line 13
                                       ORA-06512: at line 1


PL/SQL procedure successfully completed

                                       Session B> -- After session A ends
                                       Session B> exec serial;

                                       PL/SQL procedure successfully completed.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-22054 Kesalahan Aliran Bawah

  2. Apakah mungkin untuk memanggil jenis catatan di dalam kursor?

  3. Hash lebih cepat dengan lebih sedikit tabrakan?

  4. Ubah interval menjadi menit

  5. Menjalankan kueri Dynamic Sql di Oracle