हाँ यह संभव है, लेकिन क्या आपको वाकई इसकी ज़रूरत है?
यह तय करने से पहले दो बार सोचें कि यह वास्तव में दो अलग-अलग डेटाबेस होने चाहिए।
आप दोनों कनेक्शनों को खुला रख सकते हैं और यदि दूसरा विफल हो जाता है तो पहले कमांड को रोलबैक कर सकते हैं।
यदि आपको वास्तव में तैयार लेनदेन की आवश्यकता है, तो पढ़ना जारी रखें।
आपकी स्कीमा के संबंध में - मैं केवल सुविधा के लिए अनुक्रम जनरेटर और डेटाबेस पक्ष पर रिटर्निंग क्लॉज का उपयोग करूंगा।
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
गैर-शून्य मान के लिए कॉन्फ़िगरेशन चर।