PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Автономна транзакция в PostgreSQL 9.1

В момента работя по миграции от Oracle към PostgreSQL. Въпреки че съм DBA, тези дни уча малко и на пътеката за разработчици... 🙂
Нека видим малка функция на Oracle и подобен начин в PostgreSQL.

Автономна транзакция, какво е това?

Автономната транзакция е независима транзакция, която се инициира от друга транзакция и се изпълнява, без да се намесва в основната транзакция. Когато се извика автономна транзакция, първоначалната транзакция се спира. Контролът се връща, когато автономната транзакция извърши COMMIT или ROLLBACK.

Пример в 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

В моя пример по-горе, ред 3 е извършил ред 2, където трябва да се върне обратно в съответствие с ред 4. В моя пример търся блокове на транзакция, които да се държат независимо, за да го постигнем в Oracle, трябва да включим PRAGMA autonomous_transaction в процедурата декларация да се държи като независим транзакционен блок. Нека да повторим:

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

Как да накарам работа в PostgreSQL?

Автономните транзакции са много добре контролирани в Oracle. Подобна функционалност не съществува в PostgreSQL, но можете да постигнете с хак, използвайки dblink. По-долу е връзката, където е предоставен хак:
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)

Не е ли просто, благодарение на доставчика на хакване.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Опростете вложен случай, когато израз

  2. Как да вмъкна няколко стойности в таблица на postgres наведнъж?

  3. Десет начина за разширяване на функционалността на PostgreSQL

  4. Добавяне на dict обект към postgresql

  5. Как EDB стана лидер на пазара на Postgres