คำถามจากมือใหม่ insert & update

ตามภาพเลยครับมีน้องมาถามว่าจะทำอย่างไรได้บ้าง ถ้าเราจะ insert และ update ข้อมูลในปุ่มเดียวกัน

วิธีที่ 1 ตามความเห็นแรก บอกให้แยกคำสั่งคือเช็คก่อนว่ามีข้อมูลอยู่แล้วรึยัง อันนี้ผมเข้าใจว่าจะให้ทำบน code ฝั่ง server (คิดว่าน่าจะเป็นเว๊บ)

วิธีนี้เป็นวิธีที่ใช้ได้สามารถแก้ไขปัญหาได้ระดับหนึ่ง แต่จะมีอีกปัญหาคือ ถ้าเราเช็คที่ code ใน App server กรณีที่เรามี user กดปุ่ม นั้นๆ เกือบจะพร้อมๆ กัน จะเกิดอะไรขึ้น ข้อมูลจากคนที่กดก่อนจะเข้าไป insert และข้อมูลจากคนที่สองจะเข้าไป update ทีนี้คนแรกก็จะงง เฮ้ย เกิดอะไรขึ้นฉันบันทึกค่า XXXX ไว้ ทำไมระบบบันทึกเป็น YYYY นี่ละครับคือปัญหา concurrency

อะเกิดปัญหา concurrency แล้วก็ให้ lock บน Code ใน App server สิว่าให้เข้าได้ทีละ 1 user ใช่ครับทำได้ แก้ปัญหาได้ แต่เพิ่มภาระให้ App server และหลังจากนั้น ระหว่าง App server กับ Db Server ก็ต้องคุยกัน 2 ครั้ง ครั้งแรกคือ

  1. App server ส่งไปถามเฮ้ย Db server มีข้อมูลยัง?
  2. Db server ตอบกลับไปว่า เอ้ยยังวะ
  3. App server อะงั้นมึง insert ไปนะ
  4. Db server บอก Ok ok.

ส่งข้อมูลกลับไปกลับมาสนุกสนาน อย่า comunication lost นะยิ่งจะซับซ้อนไปกันใหญ่

วิธีที่ 3 ตามความเห็นที่ 3 ยิ่ง แย่เลย แทนที่จะเช็คที่ App server เรามาเช็คที่ client เลยจ้าาาา จะ lock ยังไง lock ที่ไหน ที่ client เหรอ เอา State ของ Data ไปไว้ที่ client แล้วให้ client ตัดสินใจว่าจะ insert หรือ update ….. ปวดตับ

วิธที่ 2 (ของผม) App Server ส่งข้อมูลที่ กรอกมาจาก form หลังผ่าน Business logic ไปที่ Db ให้ Db ใช้ Store procedure ตัดสินใจว่าจะ insert หรือ update วิธีนี้มีข้อดีคือการส่งข้อมูลระหว่าง App server กับ Db server ลดน้อยลงเหลือแค่ 2 และกระจายงานไปยัง Db server ได้ และยังสามารถเขียน lock table ที่ Database ได้ ถ้ากรณีมีมากกว่า 1 concurrency ก็สามารถส่งกลับไปที่ App server ให้ App server ได้เลือกว่าจะ รอเพื่อทำ transaction หรือจะส่งต่อไปยัง UI ว่าเอ้ย “ไอ้ข้อมูลที่เอ๊ง (user) จะบันทึกหนะมันมีผู้ใช้งานอยู่นะเฟ้ย รอแปร๊บ ค่อยทำใหม่” ซึ่งผมแนะนำวิธีที่สองนะ

…..ปวดตับ…มิน่าละ….

Like what you read? Give Arrak Yamebubpha a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.