sql >> Database >  >> RDS >> PostgreSQL

Autonome transactie in PostgreSQL 9.1

Momenteel ben ik bezig met migraties van Oracle naar PostgreSQL. Hoewel ik DBA ben, leer ik tegenwoordig ook een beetje op het gebied van ontwikkelaars ... 🙂
Laten we een kleine functie van Oracle en een vergelijkbare manier in PostgreSQL bekijken.

Autonome transactie, wat is dat?

Een autonome transactie is een onafhankelijke transactie die wordt geïnitieerd door een andere transactie en wordt uitgevoerd zonder de bovenliggende transactie te verstoren. Wanneer een autonome transactie wordt aangeroepen, wordt de oorspronkelijke transactie opgeschort. Controle wordt teruggegeven wanneer de autonome transactie een COMMIT of ROLLBACK uitvoert.

Voorbeeld in Oracle:

Create two tables and one procedure as shown below.

create table table_a(name varchar2(50));
create table table_b(name varchar2(50));

create or replace procedure insert_into_table_a is
begin
insert into table_a values('Am in A');
commit;
end;

Lets test it here.

SQL> begin
2 insert into table_b values('Am in B');
3 insert_into_table_a;
4 rollback;
5 end;
6 /

PL/SQL procedure successfully completed.

SQL> select * from table_a;

Am in A

SQL> select * from table_b;

Am in B

In mijn voorbeeld hierboven heeft regel 3 regel 2 vastgelegd, waar het moet terugdraaien volgens regel 4. In mijn voorbeeld ben ik op zoek naar een transactieblok om zich onafhankelijk te gedragen, om dit in Oracle te bereiken, moeten we PRAGMA autonome_transactie opnemen in de procedure verklaring om zich als onafhankelijk transactieblok te gedragen. Laten we het opnieuw doen:

Truncate table table_a;
Truncate Table table_b;

create or replace procedure insert_into_table_a is pragma autonomous_transaction;
begin
insert into table_a values('Am in A');
commit;
end;

SQL> begin
2 insert into table_b values('Am in B');
3 INSERT_INTO_TABLE_A;
4 rollback;
5 end;
6 /

PL/SQL procedure successfully completed.

SQL> select * from table_a;

NAME
----------
Am in A

SQL> select * from table_b;

no rows selected

Hoe maak je werk in PostgreSQL?

Autonomous Transaction, worden zeer goed beheerd in Oracle. Soortgelijke functionaliteit is er niet in PostgreSQL, maar u kunt dit bereiken met een hack met dblink. Hieronder is de link, waar de hack is verstrekt:
http://archives.postgresql.org/pgsql-hackers/2008-01/msg00893.php

create extension dblink;

create or replace function insert_into_table_a() returns void as $$
begin
perform dblink_connect('pragma','dbname=edb');
perform dblink_exec('pragma','insert into table_a values (''Am in A'');');
perform dblink_exec('pragma','commit;');
perform dblink_disconnect('pragma');
end;
$$ language plpgsql;

edb=# begin;
BEGIN
edb=# insert into table_b VALUES ('am in B');
INSERT 0 1
edb=# select insert_into_table_a();
insert_into_table_a
---------------------

(1 row)

edb=# select * from table_a;
name
---------
Am in A
(1 row)

edb=# select * from table_b;
name
---------
am in B
(1 row)

edb=# rollback;
ROLLBACK
edb=# select * from table_a;
name
---------
Am in A
(1 row)

edb=# select * from table_b;
name
------
(0 rows)

Is het niet eenvoudig, dankzij de hackprovider.


  1. Is de puntkomma nodig in SQL?

  2. Slaap langzaam om Postgres-verbinding te verkrijgen

  3. MySQL db vraagtekens in plaats van Hebreeuwse karakters..?

  4. Microsoft Access Tips en trucs deel 2 – Formulieren