sql >> Database teknologi >  >> RDS >> PostgreSQL

Autonom transaktion i PostgreSQL 9.1

Jeg arbejder i øjeblikket på migrationer fra Oracle til PostgreSQL. Selvom jeg er DBA, lærer jeg i disse dage også lidt på udviklersporet … 🙂
Lad os se en lille funktion af Oracle og en lignende måde i PostgreSQL.

Autonom transaktion, hvad er det?

En autonom transaktion er en uafhængig transaktion, der initieres af en anden transaktion, og som udføres uden at forstyrre modertransaktionen. Når en autonom transaktion kaldes, bliver den oprindelige transaktion suspenderet. Kontrol returneres, når den autonome transaktion foretager en COMMIT eller ROLLBACK.

Eksempel 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 mit eksempel ovenfor har linje 3 begået linje 2, hvor den skal rulle tilbage i henhold til linje 4. I mit eksempel leder jeg efter en transaktionsblok til at opføre sig uafhængigt, for at opnå det i Oracle skal vi inkludere PRAGMA autonom_transaktion i proceduren erklæring om at opføre sig som uafhængig transaktionsblok. Lad os tage igen:

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

Hvordan laver man arbejde i PostgreSQL?

Autonome transaktioner er meget velkontrollerede i Oracle. Lignende funktionalitet er der ikke i PostgreSQL, men du kan opnå med et hack ved hjælp af dblink. Nedenfor er linket, hvor hack er blevet leveret:
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)

Er det ikke enkelt, takket være hack-udbyderen.


  1. SAP Lumira og JDBC-ODBC Bridge

  2. Sådan opretter du historik ELLER reviderer visninger fra Change Data Capture (CDC) tabeller i SQL Server - SQL Server Tutorial

  3. SQL Server 2016:Opret en lagret procedure

  4. Hvad er en større version alligevel?