ข้อแรก: MySQL เป็นหนึ่งในซอฟต์แวร์ที่แย่ที่สุดที่จะนำมาใช้ในการดำเนินการนี้โดยเฉพาะอย่างยิ่งถ้ามันเป็นแบบไดนามิกมาก เหตุผลก็คือเอ็นจิ้นเช่น MEMORY และ MyISAM มีเพียงระบบล็อคเต็มตารางในขณะที่เอ็นจิ้นที่เหมาะสมกว่าเช่น InnoDB มีโทษการเขียนสูงกว่า (เพื่อให้มีคุณสมบัติของกรด) และได้รับการปรับให้เหมาะสมสำหรับการเข้าถึงระเบียน ) นอกจากนี้ยังไม่มีระบบการแจ้งเตือนการเปลี่ยนแปลงที่ดีสำหรับ MySQL - จะต้องมีการใช้งานเป็นโพล มีซอฟต์แวร์หลายสิบชิ้นที่ปรับให้เหมาะกับงานนั้นมากขึ้น
ต้องบอกว่าฉันได้เห็นการใช้งานประเภทนี้ได้สำเร็จหากความต้องการประสิทธิภาพ / ประสิทธิภาพไม่สูงมาก หลายคนไม่สามารถที่จะแนะนำและบำรุงรักษาเทคโนโลยีที่แยกจากกันเพียงส่วนเล็ก ๆ ของตรรกะทางธุรกิจ
SELECT FOR UPDATE
คือสิ่งที่คุณกำลังมองหา - อ่านเป็นอันดับ ในขณะที่ UPDATE / DELETE จะล็อคแถวระหว่างการทำธุรกรรม MYSQL ที่กำลังทำงานอยู่เสมอคุณอาจต้องการหลีกเลี่ยงการทำธุรกรรมขนาดใหญ่ในขณะที่กระบวนการกำลังดำเนินการอยู่ดังนั้น:
START TRANSACTION;
SELECT * FROM your_table WHERE state != 'PROCESSING'
ORDER BY date_added ASC LIMIT 1 FOR UPDATE;
if (rows_selected = 0) { //finished processing the queue, abort}
else {
UPDATE your_table WHERE id = $row.id SET state = 'PROCESSING'
COMMIT;
// row is processed here, outside of the transaction, and it can take as much time as we want
// once we finish:
DELETE FROM your_table WHERE id = $row.id and state = 'PROCESSING' LIMIT 1;
}
MySQL จะดูแลการล็อกทั้งหมดที่เลือกพร้อมกันยกเว้นหนึ่งเมื่อเลือกแถว เนื่องจากอาจนำไปสู่การเชื่อมต่อที่ถูกล็อคจำนวนมากในเวลาเดียวกันทำให้ธุรกรรมเริ่มต้นมีขนาดเล็กที่สุดเท่าที่จะเป็นไปได้และพยายามประมวลผลครั้งละ 1 แถวมากขึ้น