ป้ายกำกับ: Strict Mode

Conflict Resolution & Merge (การรับมือและแก้ไขข้อขัดแย้งของไฟล์เมื่อ Merge โค้ด)Conflict Resolution & Merge (การรับมือและแก้ไขข้อขัดแย้งของไฟล์เมื่อ Merge โค้ด)

ในฐานะ Senior Architect ที่ออกแบบระบบฐานข้อมูลขนาดใหญ่ ความท้าทายที่สำคัญที่สุดอย่างหนึ่งคือการรับประกันความสมบูรณ์ของข้อมูล (Data Integrity) เมื่อระบบต้องรองรับการเปลี่ยนแปลงข้อมูลพร้อมกันจากผู้ใช้งานหรือบริการหลายส่วน (Concurrent Operations) สถานการณ์ที่ข้อมูลกำลังถูกแก้ไขหรืออัปเดตในจุดเดียวกันนี้ เราเรียกมันว่า ‘Conflict’ (ความขัดแย้ง) ซึ่งเป็นหัวใจของการออกแบบระบบที่ต้องมีความทนทานสูง

สำหรับโลกของการพัฒนาแอปพลิเคชันที่ใช้ PostgreSQL การจัดการ Conflict Resolution ไม่ได้หมายถึงการรวมไฟล์โค้ด (Code Merge) แต่หมายถึงการจัดการความขัดแย้งของข้อมูล (Data Conflicts) หรือโครงสร้าง (Schema Conflicts) โดยมีเป้าหมายหลักคือการรับประกันว่าข้อมูลจะถูกอัปเดตอย่างถูกต้องและไม่สูญหาย แม้จะมีหลาย Transaction พยายามเขียนข้อมูลพร้อมกัน

หลักการทำงานของ Conflict Resolution ใน PostgreSQL

PostgreSQL มีกลไกที่แข็งแกร่งมากในการจัดการความขัดแย้งผ่านระบบ Transaction Isolation และ Constraint Checking โดยเฉพาะอย่างยิ่งการใช้คำสั่ง ON CONFLICT ซึ่งเป็นไวยากรณ์ที่ทรงพลังที่สุดในการจัดการสถานการณ์ที่ข้อมูลที่เราพยายามแทรกเข้าไปนั้นมี Primary Key หรือ Unique Constraint ที่ขัดแย้งกับข้อมูลที่มีอยู่แล้ว

การใช้ไวยากรณ์ ON CONFLICT (UPSERT)

คำสั่ง INSERT ... ON CONFLICT DO UPDATE หรือที่รู้จักกันในชื่อ UPSERT (Update or Insert) คือมาตรฐานในการจัดการ Merge ข้อมูลที่อาจซ้ำกันอย่างมีประสิทธิภาพ คำสั่งนี้ช่วยให้เราสามารถกำหนดพฤติกรรมที่ชัดเจนเมื่อเกิดความขัดแย้ง แทนที่จะปล่อยให้ระบบเกิดข้อผิดพลาด (Error) มันจะดำเนินการตามที่เรากำหนดไว้

สมมติว่าเรามีตาราง products ที่มีคอลัมน์ sku เป็น Unique Key หากเราพยายามแทรกข้อมูลที่มี sku ซ้ำกับข้อมูลเดิม เราสามารถสั่งให้ PostgreSQL ไม่เกิดข้อผิดพลาด แต่ให้ทำการอัปเดตค่าบางคอลัมน์แทนได้ทันที

SQL

-- 1. สร้างตารางตัวอย่างที่มี Unique Constraint บน sku<br>CREATE TABLE products (<code><br>    sku VARCHAR(50) PRIMARY KEY,<br>    name VARCHAR(100) NOT NULL,<br>    price NUMERIC<br>);<br><br>-- 2. ตัวอย่างการใช้ ON CONFLICT (UPSERT)<br>INSERT INTO products (sku, name, price) VALUES ('123', 'apple', 1.00) ON CONFLICT (sku) DO UPDATE SET<br>    name = EXCLUDED.name, -- EXCLUDED คือค่าที่พยายามแทรก<br>    price = EXCLUDED.price;<br><br>-- หากรันครั้งที่สองด้วย sku '123' ระบบจะอัปเดต name และ price แทนการเกิด Error<br>INSERT INTO products (sku, name, price) VALUES ('123', 'apple_new', 1.50) ON CONFLICT (sku) DO UPDATE SET<br>    name = EXCLUDED.name, <br>    price = EXCLUDED.price;<br>

บทสรุป: การรับประกันความสมบูรณ์ของข้อมูล

การเข้าใจและใช้กลไก ON CONFLICT อย่างเชี่ยวชาญ ไม่เพียงแต่ช่วยป้องกันข้อผิดพลาดในการทำงานของระบบเท่านั้น แต่ยังเป็นเครื่องมือสำคัญที่ Senior Architect ใช้ในการออกแบบ Data Pipeline ที่มีความทนทาน (Resilient) และเชื่อถือได้ (Reliable) เสมอ การใช้ UPSERT อย่างถูกต้องจึงเป็นทักษะที่จำเป็นอย่างยิ่งในการจัดการข้อมูลในสภาพแวดล้อมที่มีการทำงานพร้อมกันสูง (High Concurrency) ใน PostgreSQL