PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Transakcja autonomiczna w PostgreSQL 9.1

Obecnie pracuję nad migracjami z Oracle do PostgreSQL. Chociaż jestem DBA, obecnie uczę się też trochę na ścieżce dla programistów… 🙂
Zobaczmy małą funkcję Oracle i podobny sposób w PostgreSQL.

Transakcja autonomiczna, co to jest?

Transakcja autonomiczna to niezależna transakcja, która jest inicjowana przez inną transakcję i jest wykonywana bez ingerencji w transakcję nadrzędną. Gdy wywoływana jest transakcja autonomiczna, transakcja inicjująca zostaje zawieszona. Kontrola jest zwracana, gdy autonomiczna transakcja wykona COMMIT lub ROLLBACK.

Przykład w 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

W moim przykładzie powyżej linia 3 zatwierdziła linię 2, w której musi wycofać się zgodnie z linią 4. W moim przykładzie szukam bloków transakcyjnych, które mają zachowywać się niezależnie, aby osiągnąć to w Oracle musimy włączyć PRAGMA autonomi_transaction w Procedurze deklaracja zachowania się jako niezależny blok transakcyjny. Zróbmy ponownie:

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 zrobić pracę w PostgreSQL?

Transakcje autonomiczne, są bardzo dobrze kontrolowane w Oracle. Podobnych funkcji nie ma w PostgreSQL, jednak można to osiągnąć za pomocą włamania za pomocą dblink. Poniżej znajduje się link, pod którym hack został dostarczony:
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)

Czy to nie proste, dzięki dostawcy hakerów.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Model Django jeden klucz obcy do wielu tabel

  2. Używanie Barmana do odzyskiwania po awarii PostgreSQL

  3. Indeksowanie bazy danych w pigułce z porównaniem B+tree i Hash

  4. Zautomatyzowane aktualizacje klastrów PostgreSQL w chmurze niemal zerowe przestoje (część II)

  5. Kiedy używać tabel dziedziczonych w PostgreSQL?