লেনদেন আইডি মোড়ানোর পরে কীভাবে এক্সমিন এবং টেক্সিড_কন্টেন্ট () তুলনা করবেন?


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 লেনদেনের অনেক আগে ঘটে before মন্তব্যগুলিতে এটি লক্ষ করার জন্য ড্যানিয়েল ভুরিটকে ধন্যবাদ।


1
আপনি যে সিস্টেম হবে উপেক্ষা করছি VACUUM FREEZEএবং ওভাররাইট xminদীর্ঘ সারি উপর সামনে 2 ^ 32 Wraparound। এই বিষয়টির উপর একটি ওভারভিউয়ের জন্য আপনার টিপলসকে হিমায়িত করে দেখুন ।
ড্যানিয়েল ভ্যারিট

সত্য, আমি এই সত্যটি প্রশ্নটি ছাড়াই, এটি দেখানোর জন্য ধন্যবাদ। এবং প্রকৃতপক্ষে জমাট 2 before 32 এর অনেক আগে ঘটবে। যাইহোক, এমনকি পুরানো xminহিমশীতল হওয়ার পরেও প্রশ্নটি এখনও স্থায়ী হয় যে xminতখনকার মৃত্যুদণ্ড কার্যকর হওয়া সময়ের সাথে আরও নতুন (নিয়মিত) তুলনা করা যায় txid_current()
টমকা

1
এটি লক্ষণীয় যে পোস্টগ্রেএসকিউএল র‌্যাপ্রাউন্ড পর্যন্ত 1 মিলিয়ন এরও কম লেনদেন বাকি থাকলে বন্ধ হয়ে যাবে ।
ব্যবহারকারী 103153

উত্তর:


6

মানটির সাথে মেলে আপনি যুক্ত যুগকে ছাঁটাই করতে পারেন xmin, অর্থাত্ থেকে 4-বাইট integerবের করতে পারেন bigint। যেহেতু xminটাইপড xidএবং না (স্বাক্ষরিত)! তাই integerআমরা এর textপরিবর্তে উপস্থাপনাটি তুলনা করি :

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

বিস্তারিত ব্যাখ্যা:

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.