PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Batas waktu pada kunci penasehat di postgresql

Ini adalah prototipe pembungkus yang mengemulasi DBMS_LOCK.REQUEST dengan buruk - dibatasi hanya untuk satu jenis kunci (kunci penasihat lingkup transaksi).

Untuk membuat fungsi sepenuhnya kompatibel dengan Oracle, diperlukan beberapa ratus baris. Tapi itu permulaan.

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;
$$;

Uji menggunakan kode ini:

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. Postgres untuk mengambil daftar yang memiliki nilai yang dipisahkan koma

  2. Kesalahan postgress - pemasangan bundel

  3. Hapus pasangan Nilai Kunci dari array bersarang jsonb di postgresql

  4. Pisahkan kolom menjadi beberapa baris di Postgres

  5. Pilih kueri dengan batas offset terlalu lambat