Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Đồng bộ hóa thủ tục PL / SQL. Làm thế nào để đảm bảo thực hiện thủ tục một lần duy nhất?

Bạn có thể sử dụng DBMS_LOCK.request để tạo một chốt khóa duy nhất. Chỉ một phiên có thể giữ khóa này cùng một lúc. Nếu cơ sở dữ liệu khởi động lại phiên kết thúc đột ngột, khóa sẽ tự động được giải phóng.

Bạn quyết định khi yêu cầu khóa xem khóa có được giữ theo cam kết hay không.

Đây là một ví dụ:

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

Tôi sẽ chạy hai phiên cùng một lúc:

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. Cách kết nối với Oracle khi di chuyển

  2. Tại sao việc triển khai ODP.NET 11 xcopy không hoạt động trên máy đã cài đặt Oracle DB 10?

  3. SQL Loader Error:Trường độ dài biến vượt quá độ dài tối đa.

  4. Truy vấn Oracle Pivot đưa ra các cột có dấu ngoặc kép xung quanh tên cột. Gì?

  5. Jdbc kiểm tra khả năng - bản phát hành savepoint