sql >> Databasteknik >  >> RDS >> PostgreSQL

Autonom transaktion i PostgreSQL 9.1

Jag arbetar för närvarande med migrationer från Oracle till PostgreSQL. Även om jag är DBA, lär jag mig nu för tiden lite på utvecklarbanan också ... 🙂
Låt oss se en liten funktion i Oracle och ett liknande sätt i PostgreSQL.

Autonom transaktion, vad är det?

En autonom transaktion är en oberoende transaktion som initieras av en annan transaktion och som utförs utan att störa modertransaktionen. När en autonom transaktion anropas, avbryts den ursprungliga transaktionen. Kontroll returneras när den autonoma transaktionen gör en COMMIT eller ROLLBACK.

Exempel i 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

I mitt exempel ovan har rad 3 begått rad 2, där den måste återställas enligt rad 4. I mitt exempel letar jag efter ett transaktionsblock för att bete sig oberoende, för att uppnå det i Oracle måste vi inkludera PRAGMA autonom_transaktion i förfarandet deklaration att uppträda som ett oberoende transaktionsblock. Låt oss ta om:

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

Hur får man till att fungera i PostgreSQL?

Autonomous Transaction, är mycket väl kontrollerade i Oracle. Liknande funktionalitet finns inte i PostgreSQL, men du kan uppnå med ett hack med dblink. Nedan finns länken där hacket har tillhandahållits:
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)

Är det inte enkelt, tack vare hackleverantören.


  1. Oracle-aggregat för att sammanfoga strängar med kommatecken och för att skriva anpassade aggregat

  2. Ändra storlek på tabell-/kolumn-/indexnamn i oracle 11g eller 12c

  3. DATEDIFF() vs DATEDIFF_BIG() i SQL Server:Vad är skillnaden?

  4. Knee-Jerk Performance Tuning:Felaktig användning av tillfälliga tabeller