ฉันต้องการแทนที่เนื้อหาทั้งหมดของตารางโดยไม่กระทบกับSELECTคำสั่งที่เข้ามาในระหว่างกระบวนการ
กรณีการใช้งานคือการมีตารางที่เก็บข้อมูลกล่องจดหมายที่แตกเป็นประจำและจะต้องเก็บไว้ในตาราง PostgreSQL มีไคลเอนต์จำนวนมากที่ใช้แอปพลิเคชันที่สืบค้นตารางเดียวกันตลอดเวลา
โดยปกติฉันจะทำสิ่งที่ชอบ (pseudocode ขาเข้า) ...
BEGIN TRANSACTION
TRUNCATE TABLE
INSERT INTO
COMMIT
แต่น่าเสียดายที่ตารางไม่สามารถอ่านได้ในระหว่างกระบวนการนี้ เนื่องจากเวลาที่ใช้INSERT INTOในการทำให้เสร็จสมบูรณ์ ตารางถูกล็อค
ใน MySQL ฉันจะใช้RENAME TABLEคำสั่งatomic เพื่อหลีกเลี่ยงปัญหาเหล่านี้ ...
CREATE TABLE table_new LIKE table;
INSERT INTO table_new;
RENAME TABLE table TO table_old, table_new TO table; *atomic operation*
DROP TABLE table_old;
ฉันจะบรรลุสิ่งนี้ใน PostgreSQL ได้อย่างไร
สำหรับวัตถุประสงค์ของคำถามนี้คุณสามารถสมมติว่าฉันไม่ได้ใช้กุญแจต่างประเทศ
TRUNCATEคำสั่งจะรับการล็อก AccessExclusive บนโต๊ะดังนั้นจะไม่มีใครสามารถอ่านจากตารางได้จนกว่าธุรกรรมนั้นจะทำหรือย้อนกลับ
deleteแทนtruncateมันจะช้าลง แต่ไม่มีการปิดกั้นผู้อ่าน คุณต้องลบกี่แถว
DELETEและINSERTจะนานเกินไป