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

Hết giờ về khóa tư vấn trong postgresql

Đây là nguyên mẫu của trình bao bọc mô phỏng kém DBMS_LOCK.REQUEST - bị giới hạn ở một loại khóa duy nhất (khóa tư vấn phạm vi giao dịch).

Để làm cho chức năng tương thích hoàn toàn với Oracle, nó sẽ cần vài trăm dòng. Nhưng đó là một sự khởi đầu.

CREATE OR REPLACE FUNCTION
advisory_xact_lock_request(p_key bigint, p_timeout numeric)
RETURNS integer
LANGUAGE plpgsql AS $$
/*  Imitate DBMS_LOCK.REQUEST for PostgreSQL advisory lock. 
Return 0 on Success, 1 on Timeout, 3 on Parameter Error. */
DECLARE
    t0 timestamptz := clock_timestamp();
BEGIN
    IF p_timeout NOT BETWEEN 0 AND 86400 THEN
        RAISE WARNING 'Invalid timeout parameter';
        RETURN 3;
    END IF;
    LOOP
        IF pg_try_advisory_xact_lock(key) THEN
            RETURN 0;
        ELSIF clock_timestamp() > t0 + (p_timeout||' seconds')::interval THEN
            RAISE WARNING 'Could not acquire lock in % seconds', p_timeout;
            RETURN 1;
        ELSE
            PERFORM pg_sleep(0.01); /* 10 ms */
        END IF;
    END LOOP;
END;
$$;

Kiểm tra nó bằng cách sử dụng mã này:

SELECT CASE 
    WHEN advisory_xact_lock_request(1, 2.5) = 0
    THEN pg_sleep(120)
END; -- and repeat this in parallel session 

/* Usage in Pl/PgSQL */

lkstat := advisory_xact_lock_request(lkhndl, lktimeout);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để bạn có thể kết nối những người dùng đang hoạt động với cơ sở dữ liệu postgreSQL thông qua SQL?

  2. Truy vấn kinh độ vĩ độ PostgreSQL

  3. Trả lại mọi hàng thứ n từ cơ sở dữ liệu bằng ActiveRecord trong đường ray

  4. Tôi muốn chèn bằng mikro-orm, nhưng nó không tìm thấy bảng của tôi:c (TableNotFoundException)

  5. Cấp tất cả trên một lược đồ cụ thể trong db cho một vai trò nhóm trong PostgreSQL