[PHP/MySQL] script เหมือนโดนเรียกมากกว่า 1 ครั้ง ทั้งๆ เรียกครั้งเดียวครับ

เรื่องของเรื่องคือผมต้องการจะ update field nextDue เพิ่มไปอีก 1 อาทิตย์  สำหรับทุกๆ record ที่ comments มี string ที่ว่า [week30] และเมื่อ add 1 อาทิตย์ไปแล้ว ก็ให้เพิ่ม string [week30done] เข้าไปด้วย ให้รู้ว่า record นี้ทำงานเสร็จไปแล้ว ด้วย query ประมาณนี้ครับ


UPDATE workload_schedules
SET comments = CONCAT("[week30done]" , comments)
, nextDue = nextDue + INTERVAL 1 WEEK
WHERE comments LIKE "%[week30]%"
AND comments NOT LIKE "%[week30done]%"

แต่พอ run script ผ่าน browser กลายเป็นว่า nextDue โดนเพิ่มไปอีก 4 อาทิตย์ และใน field comments  ก็กลายเป็น  [week30done][week30done][week30done][week30done][week30] ไปซะงั้น

ซึ่งตาม logic แล้วมันไม่น่าจะเป็นไปได้ เพราะถ้ามีการ run ไปแล้ว record จะมี string [week30done] และทำให้เงื่อนไขหลังของ where clause ไม่เป็นจริง


ข้อมูลเพิ่มเติมครับ
1.) ไม่ได้เกิดขึ้นทุกกรณี  แต่ "มักจะ" เกิด เมื่อมี การ update table ที่มีขนาดค่อนข้างใหญ่
table ที่เคยเกิดปัญหานี้มาก่อน มี record ราวๆ 50,000   ... แต่ table ที่เกิดปัญหาล่าสุดมีแค่ 7000 record เอง
script คล้ายๆกัน จำนวน records ใกล้ๆกัน  แต่ถ้าจำนวน records ที่ match ไม่เยอะนัก ก็จะไม่เจอปัญหาครับ

2.) ผมเคยจนแต้มถึงขนาดที่ว่า ให้มีการเขียนไฟล์ก่อนจะเริ่มทำงาน  ถ้ามีไฟล์ชื่อนี้แล้วให้ยกเลิกการทำงานทั้งหมด  แต่ก็แก้ไม่ได้ครับ
code ประมาณนี้

if(is_readable('script_loaded.txt')) {
    die('Already loaded');
}
@file_put_contents('script_loaded.txt' , '1');

ผลลัพธ์ คือ มี file script_loaded.txt  แต่ก็ยังโดนเรียก 4 ครั้ง

3.) ทุกครั้งที่มีปัญหา   จะเกิดซ้ำ 4 ครั้งตลอดๆ

4.) เคยสงสัยว่าเป็นเพราะ browser แอบส่ง request ซ้ำไปหรือเปล่า  ก็เลยใช้วิธี เขียน PHP ขึ้นมาอีกตัว  แล้วให้มันไป request  script ที่ทำงานอีกที่นึง ตาม code ประมาณนี้ครับ

// doUpdate.php เป็ script ที่มี  Query Update ด้านบนครับ
echo  file_get_contents('http://www.xyz.com/scripts/doUpdate.php');

ปรากฎว่าใช้งานได้ตามที่ต้องการครับ คือมาครั้งเดียว


คำถามครับ
A.) ปัญหาเกิดจากอะไรครับ  ทำไมถึงการเป็นการทำงานซ้ำ 4 ครั้ง
B.) ทำไมไม่ได้เกิดปัญหาทุกครั้ง มักจะเกิดเฉพาะ case ที่มีการ update ขนาดใหญ่ เงื่อนไขที่ทำให้เกิดปัญหาคืออะไรครับ
C.) มีวิธีแก้ไหมครับ  ถ้าจะต้อง เรียกผ่าน request เหมือนในข้อ 4.) ทุกครั้งนี่คงไม่สะดวกแน่

ขอบคุณครับ
แสดงความคิดเห็น
โปรดศึกษาและยอมรับนโยบายข้อมูลส่วนบุคคลก่อนเริ่มใช้งาน อ่านเพิ่มเติมได้ที่นี่