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

पोस्टग्रेस्क्ल:लेनदेन तैयार करें

हाँ यह संभव है, लेकिन क्या आपको वाकई इसकी ज़रूरत है?

यह तय करने से पहले दो बार सोचें कि यह वास्तव में दो अलग-अलग डेटाबेस होने चाहिए।

आप दोनों कनेक्शनों को खुला रख सकते हैं और यदि दूसरा विफल हो जाता है तो पहले कमांड को रोलबैक कर सकते हैं।

यदि आपको वास्तव में तैयार लेनदेन की आवश्यकता है, तो पढ़ना जारी रखें।

आपकी स्कीमा के संबंध में - मैं केवल सुविधा के लिए अनुक्रम जनरेटर और डेटाबेस पक्ष पर रिटर्निंग क्लॉज का उपयोग करूंगा।

CREATE TABLE tbl_album (
  id    serial PRIMARY KEY,
  name  varchar(128) UNIQUE,
  ...
);
CREATE TABLE tbl_user_album (
  id          serial PRIMARY KEY,
  album_id    bigint NOT NULL,
  ...
);

इस कार्य को ठीक से करने के लिए अब आपको कुछ बाहरी गोंद - वितरित लेनदेन समन्वयक (?) - की आवश्यकता होगी।

ट्रिक है PREPARE TRANSACTION COMMIT . के बजाय . फिर दोनों लेन-देन सफल होने के बाद, COMMIT PREPARED<का उपयोग करें /कोड>

PHP प्रूफ-ऑफ-कॉन्सेप्ट नीचे है।

चेतावनी! इस कोड में महत्वपूर्ण अनुपलब्ध है भाग - वह त्रुटि नियंत्रण है। $db2 . में कोई त्रुटि पकड़ा जाना चाहिए और रोलबैक तैयार $db1 . पर निष्पादित किया जाना चाहिए यदि आपको त्रुटियां नहीं मिलती हैं तो आप $db1 . छोड़ देंगे जमे हुए लेनदेन के साथ जो वास्तव में, वास्तव में खराब है।

<?php
$db1 = pg_connect( "dbname=db1" );
$db2 = pg_connect( "dbname=db2" );
$transid = uniqid();

pg_query( $db1, 'BEGIN' );
$result = pg_query( $db1, "INSERT INTO tbl_album(name) VALUES('Absolutely Free') RETURNING id" );
$row = pg_fetch_row($result);
$albumid = $row[0];
pg_query( $db1, "PREPARE TRANSACTION '$transid'" );
if ( pg_query( $db2, "INSERT INTO tbl_user_album(album_id) VALUES($albumid)" ) ) {
    pg_query( $db1, "COMMIT PREPARED '$transid'" );
}
else {
    pg_query( $db1, "ROLLBACK PREPARED '$transid'" );
}
?>

और फिर - उपयोग करने से पहले सोचें। इरविन जो प्रस्तावित करता है वह अधिक समझदार हो सकता है।

ओह और बस एक और नोट... इस PostgreSQL सुविधा का उपयोग करने के लिए, आपको max_prepared_transactions गैर-शून्य मान के लिए कॉन्फ़िगरेशन चर।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. यह रेगेक्स पोस्टग्रेएसक्यूएल में क्यों काम नहीं करेगा?

  2. How to_date () PostgreSQL में काम करता है

  3. POSTGRESQL में CHARINDEX (SQL सर्वर) समतुल्य क्या है?

  4. PostgreSQL में DROPping करते समय संदर्भित तालिकाओं पर अनन्य एक्सेस लॉक से बचें

  5. pg_ctl:साझा पुस्तकालयों को लोड करते समय त्रुटि:libpq.so.5