sql >> Databáze >  >> RDS >> PostgreSQL

Autonomní transakce v PostgreSQL 9.1

V současné době pracuji na migracích z Oracle na PostgreSQL. I když jsem DBA, v těchto dnech se také trochu učím na úrovni vývojářů... 🙂
Podívejme se na malou funkci Oracle a podobný způsob v PostgreSQL.

Autonomní transakce, co to je?

Autonomní transakce je nezávislá transakce, která je iniciována jinou transakcí a provádí se, aniž by zasahovala do nadřazené transakce. Když je volána autonomní transakce, původní transakce je pozastavena. Řízení je vráceno, když autonomní transakce provede COMMIT nebo ROLLBACK.

Příklad v 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

V mém příkladu výše řádek 3 potvrdil řádek 2, kde se musí vrátit zpět podle řádku 4. V mém příkladu hledám transakční bloky, které by se chovaly nezávisle, abychom toho dosáhli v Oracle, musíme do procedury zahrnout PRAGMA autonomous_transaction prohlášení, že se bude chovat jako nezávislý transakční blok. Pojďme znovu natočit:

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

Jak zajistit práci v PostgreSQL?

Autonomous Transaction, jsou v Oracle velmi dobře řízeny. Podobná funkcionalita v PostgreSQL není, ale můžete toho dosáhnout pomocí hacku pomocí dblink. Níže je odkaz, kde byl poskytnut hack:
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)

Není to jednoduché, díky poskytovateli hacků.


  1. Přejmenování primárního klíče v SQL Server (T-SQL)

  2. Vzory šablon a modifikátory pro číselné formátování v PostgreSQL

  3. Odesílejte e-maily s přílohami v Oracle D2k, Oracle Forms 10g, Oracle Forms 6i

  4. Určení data Velikonoc pro jakýkoli rok v Oracle PLSQL