PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Giao dịch tự trị trong PostgreSQL 9.1

Hiện đang làm việc trên Migrations từ Oracle sang PostgreSQL. Mặc dù là DBA, nhưng những ngày này tôi cũng đang học hỏi một chút về đường dành cho Nhà phát triển… 🙂
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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn đệ quy được sử dụng để đóng bắc cầu

  2. Cách kết nối với Postgres qua Node.js

  3. Các phương pháp hay nhất về sao chép PostgreSQL - Phần 2

  4. Rails tự động gán id đã tồn tại

  5. 2 cách trả về hàng có chứa ký tự không phải chữ và số trong PostgreSQL