นอกจากคอลัมน์ปกติแล้วตาราง 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 ของคุณเพื่อดูภาพรวมของวัตถุ