समझने के लिए मुख्य बिंदु:
-
सब कुछ लेन-देन में है। अगर आप
BEGIN
. के साथ स्पष्ट रूप से एक नहीं बनाते हैं औरCOMMIT
(याROLLBACK
) एक आपके लिए केवल उस कथन के लिए बनाया गया है। -
केवल पढ़ने के लिए
SELECT
पूर्ण लेन-देन आईडी नहीं मिलता है, उन्हें केवल एक आभासी लेनदेन आईडी मिलती है। तो भले ही यह एक लेन-देन है,SELECT 1;
या जो कुछ भी लेन-देन आईडी काउंटर में वृद्धि नहीं करता है। -
कॉलिंग
txid_current()
बल लेन-देन आईडी का आवंटन यदि कोई पहले से आवंटित नहीं किया गया था। इसलिए केवल-पढ़ने वाले लेन-देन में अब एक लेन-देन आईडी होगी, जहां पहले यह नहीं होता था।
बेशक, सभी सत्रों में txid भी आवंटित किए जाते हैं। यदि डेटाबेस व्यस्त है तो व्यवहार में आपके ऊपर दिए गए उदाहरण में a+1 और a+429 का txid हो सकता है।
आवेदन स्तर पर किसी भी चीज़ के लिए लेन-देन आईडी का उपयोग करना आम तौर पर बुद्धिमानी नहीं है। विशेष रूप से:
xmin
Treat का इलाज करें और xmax
आंतरिक सिस्टम स्तर फ़ील्ड के रूप में, और txid_current()
. के परिणाम को मानें एक अर्थहीन संख्यात्मक मान के रूप में।
xids के सही और गलत उपयोग पर विवरण
विशेष रूप से आपको कभी नहीं करना चाहिए:
- xids की संख्यात्मक मान से तुलना करें ताकि उनके क्रम के बारे में किसी प्रकार का निष्कर्ष निकाला जा सके;
- लेन-देन आईडी जोड़ें या घटाएं;
- लेन-देन आईडी क्रमित करें;
- इन्क्रीमेंट या डिक्रीमेंट ट्रांजैक्शन आईडी
- 32-बिट
xid
की तुलना करें 64-बिटbigint
. के साथ टाइप किया गया फ़ील्ड युग-विस्तारित xid, समानता के लिए भी।
तो एक अनुप्रयोग परिप्रेक्ष्य से xids न तो मोनोटोनिक और न ही क्रमिक हैं।
आप कर सकते हैं सुरक्षित रूप से:
- समानता या असमानता के लिए दो 64-बिट युग-विस्तारित xids की तुलना करें; और
- xids पास करें
txid_status(...)
और अन्य कार्यों को xid लेने के रूप में प्रलेखित किया गया है
सावधान रहें:PostgreSQL 32-बिट संकीर्ण xids का उपयोग करता है जैसे xid
प्रकार, और 64-बिट युग-विस्तारित xids को आमतौर पर bigint
. के रूप में दर्शाया जाता है जैसे txid_current()
. द्वारा लौटाए गए . समानता के लिए इनकी तुलना करना आम तौर पर एक नए डेटाबेस इंस्टाल पर काम करता प्रतीत होगा, लेकिन एक बार पहला युग रैपराउंड हो जाने के बाद और वे अब बराबर नहीं होंगे। पीजी आपको एसक्यूएल स्तर पर एक्सआईडी युग देखने का एक आसान तरीका भी नहीं देता है; आपको यह करना होगा:
select (txid_current() >> 32) AS xid_epoch;
txid_current()
द्वारा रिपोर्ट किए गए युग-विस्तारित xid के ऊपरी 32 बिट्स प्राप्त करने के लिए ।
इसलिए ... आप जो भी करने की कोशिश कर रहे हैं, हो सकता है कि ट्रांजेक्शन आईडी इसे करने का सही तरीका न हो।