ID ID रैपराउंड के बाद xmin और txid_current () की तुलना कैसे करें?


12

इसके नियमित कॉलम के अलावा, पोस्टग्रैज टेबल में विभिन्न सिस्टम कॉलम भी उपलब्ध हैं। उनमें से xminएक, पंक्ति बनाने के लिए उपयोग किए जाने वाले लेनदेन आईडी को संग्रहीत करता है। इसका डेटा प्रकार xid, एक चार बाइट पूर्णांक है जो किसी बिंदु पर चारों ओर लपेटता है (अर्थात आवश्यक रूप से अद्वितीय नहीं)। txid_current()बदले में फ़ंक्शन वर्तमान लेनदेन आईडी को लौटाता है, लेकिन जैसा कि bigint, क्योंकि यह "एक" युग "काउंटर के साथ बढ़ाया गया है, इसलिए यह स्थापना के जीवन के दौरान चारों ओर नहीं लपेटेगा" ( मैनुअल को उद्धृत करने के लिए )।

यदि लेन-देन रैपराउंड अभी तक नहीं हुआ है, तो दोनों मान मेल खाते हैं:

# CREATE TABLE test (label text);
CREATE TABLE
# INSERT INTO test VALUES ('test') RETURNING txid_current();
 txid_current 
--------------
   674500
(1 row)
INSERT 0 1
# SELECT xmin FROM test;
  xmin  
--------
 674500
(1 row)

लेकिन मुझे आश्चर्य है कि क्या ये दोनों मूल्य हमेशा तुलनीय हैं? जहां तक ​​मैं समझता हूं, txid_current()लेन-देन आईडी रैपराउंड (अधिकतम 2 ^ 32 लेनदेन) के बाद अद्वितीय मूल्यों को वितरित करना जारी रखेगा और xminशून्य से शुरू होगा। इसका मतलब है कि दोनों उस बिंदु पर अलग-अलग मान लौटाने लगते हैं?

और अगर यह सच है, तो क्या xidकोई txid_current()परिणाम नियमित रूप से निकालने का एक तरीका है ताकि यह xminएक तालिका में प्रविष्टियों से मेल खाए (उदाहरण के txid_current()लिए पूर्णांक में कास्टिंग )?

संपादित करें : यह स्पष्ट करें कि मुझे इस बात की परवाह है कि लेनदेन आईडी रैपराउंड के बाद क्या होता है, जो कि 2 ^ 32 लेनदेन से बहुत पहले होता है। टिप्पणियों में इस पर ध्यान देने के लिए डैनियल वेरिटा का धन्यवाद।


1
आप इस तथ्य को नजरअंदाज कर रहे हैं कि सिस्टम 2 ^ 32 रैपराउंड से बहुत पहले पंक्तियों पर VACUUM FREEZEओवरराइट कर देगा xmin। की जाँच करें आपका tuples बंद बर्फ़ीली विषय पर एक सिंहावलोकन के लिए।
डैनियल वेरिटा

सच है, मैंने इस तथ्य को सवाल से बाहर छोड़ दिया, इसके लिए इशारा करने के लिए धन्यवाद। और वास्तव में ठंड 2 ^ 32 से बहुत पहले होगी। हालांकि, यहां तक ​​कि पुराने xminजमे हुए होने के साथ सवाल अभी भी खड़ा है कि नए (नियमित) xminएक तब निष्पादित की तुलना में कैसे txid_current()
टमाटर

1
यह ध्यान देने योग्य है कि यदि पोस्टप्रेसीक्यूप बंद होने तक 1 मील से कम लेन-देन होने पर PostgreSQL बंद हो जाएगा ।
user103153

जवाबों:


6

आप मूल्य से मिलान करने के लिए जोड़े गए युग को स्ट्रिप कर सकते हैं xmin, अर्थात 4-बाइट integerको निकाल सकते हैं bigint। चूंकि xminटाइप है xidऔर नहीं (हस्ताक्षरित!) integer, हम textइसके बजाय प्रतिनिधित्व की तुलना करते हैं:

SELECT * FROM test
WHERE  xmin::text = (txid_current() % (2^32)::bigint)::text;

विस्तृत विवरण:

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.