วิธีการเปรียบเทียบ xmin และ txid_current () หลังจากการทำธุรกรรม ID wraparound?


12

นอกจากคอลัมน์ปกติแล้วตาราง Postgres ยังมีคอลัมน์ระบบต่าง ๆให้ใช้งาน หนึ่งในนั้นxminเก็บ ID ธุรกรรมที่ใช้ในการสร้างแถว ชนิดข้อมูลของมันคือxidจำนวนเต็มสี่ไบต์ที่ล้อมรอบในบางจุด (เช่นไม่จำเป็นต้องไม่ซ้ำกัน) ฟังก์ชันtxid_current()จะส่งคืน ID ธุรกรรมปัจจุบัน แต่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 ขอบคุณ Daniel Véritéสำหรับการสังเกตในความคิดเห็น


1
คุณไม่สนใจความจริงที่ว่าระบบจะVACUUM FREEZEเขียนทับxminแถวบนก่อนที่จะมีการขึ้นบรรทัด 2 ^ 32 ตรวจสอบการแช่แข็ง Tuples Off ของคุณเพื่อดูภาพรวมของวัตถุ
Daniel Vérité

จริงฉันทิ้งความจริงนี้จากคำถามขอบคุณที่ชี้ไปที่มัน และการแช่แข็งจะเกิดขึ้นนานก่อน 2 ^ 32 อย่างไรก็ตามแม้จะมีการเก่าxminกลายเป็นแช่แข็งคำถามที่ยังคงยืนอยู่กับวิธีการใหม่ (ปกติ) เปรียบเทียบกับดำเนินการแล้วxmin txid_current()
tomka

1
เป็นที่น่าสังเกตว่า PostgreSQL จะปิดตัวลงหากมีการทำธุรกรรมน้อยกว่า1 ล้านครั้งจนกว่าจะถึงเวลาปิด
user103153

คำตอบ:


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.