PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Autonome Transaktion in PostgreSQL 9.1

Derzeit arbeite ich an Migrationen von Oracle nach PostgreSQL. Obwohl ich DBA bin, lerne ich heutzutage auch ein bisschen auf der Entwicklerstrecke … 🙂
Sehen wir uns ein kleines Feature von Oracle und einen ähnlichen Weg in PostgreSQL an.

Autonome Transaktion, was ist das?

Eine autonome Transaktion ist eine unabhängige Transaktion, die von einer anderen Transaktion initiiert wird und ohne Beeinträchtigung der übergeordneten Transaktion ausgeführt wird. Wenn eine autonome Transaktion aufgerufen wird, wird die ursprüngliche Transaktion ausgesetzt. Die Steuerung wird zurückgegeben, wenn die autonome Transaktion ein COMMIT oder ROLLBACK durchführt.

Beispiel 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 meinem obigen Beispiel hat Zeile 3 die Zeile 2 festgeschrieben, wo sie gemäß Zeile 4 zurückgesetzt werden muss. In meinem Beispiel suche ich nach Transaktionsblöcken, die sich unabhängig verhalten. Um dies in Oracle zu erreichen, müssen wir PRAGMA autonome_transaktion in die Prozedur aufnehmen Erklärung, sich als unabhängiger Transaktionsblock zu verhalten. Wiederholen wir:

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

Wie funktioniert PostgreSQL?

Autonome Transaktionen werden in Oracle sehr gut kontrolliert. Eine ähnliche Funktionalität gibt es in PostgreSQL nicht, Sie können sie jedoch mit einem Hack mit dblink erreichen. Unten ist der Link, wo Hack bereitgestellt wurde:
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)

Ist es nicht einfach, dank des Hackanbieters.