sql >> Databasteknik >  >> RDS >> PostgreSQL

Upprörd med en transaktion

Om vi ​​antar denna enkla tabell:

CREATE TABLE tbl(id int primary key, value int);

Denna funktion nästan 100 % säker (se kommentarer) för samtidiga transaktioner.:

CREATE OR REPLACE FUNCTION f_upsert(_id int, _value int)
  RETURNS void AS
$func$
BEGIN
LOOP
   UPDATE tbl SET value = _value WHERE  id = _id;

   EXIT WHEN FOUND;

   BEGIN
      INSERT INTO tbl (id, value)
      VALUES (_id, _value);

      RETURN;

   EXCEPTION WHEN UNIQUE_VIOLATION THEN     -- tbl.id has UNIQUE constraint.
      RAISE NOTICE 'It actually happened!'; -- hardly ever happens
   END;

END LOOP;
END
$func$ LANGUAGE plpgsql;

Ring:

SELECT f_upsert(2, 2);

Den är väldigt lik denna INSERT / SELECT fall med mer förklaring och länkar:

  • Är SELECT eller INSERT i en funktion utsatt för tävlingsförhållanden?



  1. Säkerhetskopiera en databas i SQL Server 2017

  2. Motsvarar unpivot() i PostgreSQL

  3. 10 effektiva sätt att bli mer produktiv på jobbet

  4. Ingen funktion matchar det angivna namnet och argumenttyperna