Mari kita lihat fitur kecil Oracle dan cara serupa di PostgreSQL.
Transaksi Otonom, apa itu?
Transaksi otonom adalah transaksi independen yang dimulai oleh transaksi lain, dan dijalankan tanpa mengganggu transaksi induk. Ketika transaksi otonom dipanggil, transaksi asal akan ditangguhkan. Kontrol dikembalikan ketika transaksi otonom melakukan COMMIT atau ROLLBACK.
Contoh di 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
Dalam contoh saya di atas, baris 3 telah melakukan baris 2, di mana ia harus melakukan rollback sesuai dengan baris 4. Dalam contoh saya, saya mencari blok transaksi untuk berperilaku secara independen, untuk mencapainya di Oracle kita perlu memasukkan PRAGMA otonom_transaksi dalam Prosedur deklarasi untuk berperilaku sebagai blok transaksi independen. Ayo Ambil Ulang:
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
Bagaimana membuat pekerjaan di PostgreSQL ?
Transaksi Otonom, dikontrol dengan sangat baik di Oracle. Fungsi serupa tidak ada di PostgreSQL, namun Anda dapat mencapainya dengan peretasan menggunakan dblink. Di bawah ini adalah tautan, tempat peretasan telah disediakan:
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)
Bukankah itu sederhana, terima kasih kepada penyedia peretasan.