sql >> Database >  >> RDS >> PostgreSQL

Time-out op adviserende vergrendelingen in postgresql

Dit is een prototype van een wrapper die DBMS_LOCK.REQUEST slecht emuleert - beperkt tot slechts één type vergrendeling (adviesvergrendeling voor transactiebereik).

Om de functie volledig compatibel te maken met die van Oracle, zou het enkele honderden regels nodig hebben. Maar dat is een begin.

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

Test het met deze code:

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. Wat te doen als je gehele getallen groter dan 20 cijfers nodig hebt op mysql?

  2. Hoe maak je een duidelijke join met MySQL

  3. MyBatis-toewijzing voor het ophalen van een lijst met aangepaste recordtypen in Oracle

  4. De eigenschap IDENTITY() gebruiken in SQL Server