Hãy xem một tính năng nhỏ của Oracle và một cách tương tự trong PostgreSQL.
Giao dịch tự trị, nó là gì?
Giao dịch tự trị là một giao dịch độc lập được khởi tạo bởi một giao dịch khác và thực hiện mà không can thiệp vào giao dịch mẹ. Khi một giao dịch tự trị được gọi, giao dịch gốc sẽ bị tạm dừng. Quyền kiểm soát được trả lại khi giao dịch tự quản thực hiện CAM KẾT hoặc QUAY LẠI.
Ví dụ trong 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
Trong ví dụ của tôi ở trên, dòng 3 đã cam kết dòng 2, nơi nó phải khôi phục lại theo dòng 4. Trong ví dụ của tôi, tôi đang tìm kiếm một khối giao dịch để hoạt động độc lập, để đạt được nó trong Oracle, chúng ta cần bao gồm PRAGMA self_transaction trong Thủ tục. tuyên bố hoạt động như một khối giao dịch độc lập. Cho phép học lại:
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
Làm thế nào để thực hiện công việc trong PostgreSQL?
Giao dịch tự trị, được kiểm soát rất tốt trong Oracle. Chức năng tương tự không có trong PostgreSQL, tuy nhiên bạn có thể đạt được bằng cách hack bằng dblink. Dưới đây là liên kết, nơi hack đã được cung cấp:
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)
Không đơn giản phải không, nhờ nhà cung cấp hack.