หนึ่งจะใช้ล็อคในแง่ดีอย่างถูกต้องใน MySQL ได้อย่างไร
ทีมของเราได้อนุมานว่าเราต้องทำ # 4 ด้านล่างมิฉะนั้นอาจมีความเสี่ยงที่เธรดอื่นสามารถอัปเดตบันทึกรุ่นเดียวกัน แต่เราต้องการตรวจสอบว่านี่เป็นวิธีที่ดีที่สุด
- สร้างเขตข้อมูลเวอร์ชันบนตารางที่คุณต้องการใช้การล็อคในแง่ดีสำหรับคอลัมน์ชื่อ = "รุ่น"
- เมื่อเลือกตรวจสอบให้แน่ใจว่าได้รวมคอลัมน์รุ่นแล้วจดบันทึกเวอร์ชัน
- ในการอัปเดตครั้งต่อ ๆ ไปคำสั่งการอัปเดตควรออก "โดยที่ version = X" โดยที่ X คือรุ่นที่เราได้รับใน # 2 และตั้งค่าฟิลด์เวอร์ชันระหว่างคำสั่งการอัปเดตนั้นเป็น X + 1
- ดำเนินการ
SELECT FOR UPDATE
เกี่ยวกับบันทึกที่เรากำลังจะอัปเดตเพื่อให้เราเป็นอันดับที่สามารถเปลี่ยนแปลงบันทึกที่เรากำลังพยายามที่จะปรับปรุง
เพื่อชี้แจงเราพยายามป้องกันสองเธรดที่เลือกเร็กคอร์ดเดียวกันในหน้าต่างเวลาเดียวกันที่พวกเขาคว้าเร็กคอร์ดเวอร์ชันเดียวกันจากการเขียนทับกันถ้าพวกเขาพยายามและอัพเดตเร็กคอร์ดในเวลาเดียวกัน เราเชื่อว่าหากเราไม่ทำ # 4 มีโอกาสที่ถ้าทั้งสองเธรดป้อนธุรกรรมของตนในเวลาเดียวกัน (แต่ยังไม่ได้ออกการอัปเดต) เมื่อพวกเขาไปอัปเดตเธรดที่สองที่จะใช้ UPDATE ... โดยที่ version = X จะทำงานกับข้อมูลเก่า
เราคิดถูกต้องหรือไม่ว่าเราต้องทำการล็อกในแง่ร้ายเมื่อทำการอัพเดตแม้ว่าเราจะใช้ฟิลด์เวอร์ชั่น / การล็อคในแง่ดี
SELECT ... FOR UPDATE
หรือในแง่ดีโดยการกำหนดเวอร์ชันของแถวไม่ใช่ทั้งสองอย่าง ดูรายละเอียดในคำตอบ