นอกจากคอลัมน์ปกติแล้วตาราง 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éสำหรับการสังเกตในความคิดเห็น
xminกลายเป็นแช่แข็งคำถามที่ยังคงยืนอยู่กับวิธีการใหม่ (ปกติ) เปรียบเทียบกับดำเนินการแล้วxmin txid_current()
VACUUM FREEZEเขียนทับxminแถวบนก่อนที่จะมีการขึ้นบรรทัด 2 ^ 32 ตรวจสอบการแช่แข็ง Tuples Off ของคุณเพื่อดูภาพรวมของวัตถุ