PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

PostgreSQL 9.1 . में स्वायत्त लेनदेन

वर्तमान में Oracle से PostgreSQL में माइग्रेशन पर काम कर रहा हूँ। हालांकि मैं डीबीए हूं, इन दिनों मैं डेवलपर ट्रैक पर भी कुछ सीख रहा हूं ... 🙂
आइए ओरेकल की एक छोटी सी विशेषता और पोस्टग्रेएसक्यूएल में इसी तरह के तरीके को देखते हैं।

स्वायत्त लेन-देन, यह क्या है?

एक स्वायत्त लेनदेन एक स्वतंत्र लेनदेन है जो किसी अन्य लेनदेन द्वारा शुरू किया जाता है, और मूल लेनदेन में हस्तक्षेप किए बिना निष्पादित होता है। जब एक स्वायत्त लेनदेन कहा जाता है, तो मूल लेनदेन निलंबित हो जाता है। जब स्वायत्त लेनदेन एक COMMIT या रोलबैक करता है तो नियंत्रण वापस कर दिया जाता है।

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 के अनुसार रोलबैक करना है। मेरे उदाहरण में स्वतंत्र रूप से व्यवहार करने के लिए एक लेनदेन ब्लॉक की तलाश है, इसे ओरेकल में प्राप्त करने के लिए हमें प्रक्रिया में PRAGMA स्वायत्त_लेनदेन शामिल करना होगा। स्वतंत्र लेनदेन ब्लॉक के रूप में व्यवहार करने की घोषणा। लेट्स रीटेक:

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. PostgreSQL के लिए क्लस्टर-टू-क्लस्टर प्रतिकृति को कैसे कॉन्फ़िगर करें

  2. PostgreSQL विदेशी कुंजी शर्त के लिए बाधा की जाँच करें

  3. GroupingError:ERROR:कॉलम ग्रुप बाय क्लॉज में दिखाई देना चाहिए या एक समग्र फ़ंक्शन में उपयोग किया जाना चाहिए

  4. Postgres क्यों कहता है कि कॉलम मौजूद नहीं है?

  5. पोस्टग्रेज़ यूयूआईडी जेडीबीसी काम नहीं कर रहा है