คำถามซ้ำจาก:
/programming/129329/optimistic-vs-pessimistic-locking
คัดลอก / วางคำตอบจากลิงค์ด้านบน:
การล็อก Optimistic เป็นกลยุทธ์ที่คุณอ่านบันทึกจดหมายเลขเวอร์ชันและตรวจสอบว่าเวอร์ชันไม่เปลี่ยนแปลงก่อนที่คุณจะเขียนบันทึก เมื่อคุณเขียนบันทึกกลับคุณกรองการปรับปรุงในรุ่นเพื่อให้แน่ใจว่ามันเป็นอะตอม (เช่นยังไม่ได้รับการอัปเดตระหว่างเมื่อคุณตรวจสอบรุ่นและเขียนบันทึกลงดิสก์) และอัปเดตเวอร์ชันในหนึ่งครั้ง
หากบันทึกสกปรก (เช่นรุ่นที่แตกต่างกับของคุณ) คุณยกเลิกการทำธุรกรรมและผู้ใช้สามารถเริ่มต้นใหม่ได้
กลยุทธ์นี้ใช้ได้กับระบบที่มีปริมาณมากและสถาปัตยกรรมสามระดับที่คุณไม่จำเป็นต้องรักษาการเชื่อมต่อกับฐานข้อมูลสำหรับเซสชันของคุณ ในสถานการณ์นี้ไคลเอนต์ไม่สามารถรักษาล็อกฐานข้อมูลจริง ๆ ได้เนื่องจากการเชื่อมต่อที่นำมาจากกลุ่มและคุณอาจไม่ได้ใช้การเชื่อมต่อเดียวกันจากการเข้าถึงที่หนึ่งไปยังถัดไป
การล็อกในแง่ร้ายคือเมื่อคุณล็อกระเบียนสำหรับการใช้งานแบบเอกสิทธิ์เฉพาะบุคคลของคุณจนกว่าคุณจะเสร็จสิ้น มันมีความสมบูรณ์ที่ดีกว่าการล็อคในแง่ดี แต่คุณต้องระวังการออกแบบแอปพลิเคชันของคุณเพื่อหลีกเลี่ยงการหยุดชะงัก ในการใช้การล็อคในแง่ร้ายคุณจำเป็นต้องมีการเชื่อมต่อโดยตรงกับฐานข้อมูล (ตามปกติจะเป็นกรณีในแอปพลิเคชันเซิร์ฟเวอร์ไคลเอ็นต์สองชั้น) หรือ ID ธุรกรรมที่มีอยู่ภายนอกที่สามารถใช้งานได้อย่างอิสระจากการเชื่อมต่อ
ในกรณีหลังคุณเปิดการทำธุรกรรมด้วย TxID จากนั้นเชื่อมต่ออีกครั้งโดยใช้ ID นั้น DBMS รักษาล็อคและช่วยให้คุณสามารถเลือกเซสชันสำรองผ่าน TxID นี่คือวิธีการกระจายการทำธุรกรรมโดยใช้โปรโตคอลการส่งสองเฟส (เช่น XA หรือธุรกรรม COM +)
แก้ไข (การเพิ่มข้อมูลเพิ่มเติมเพื่อตอบคำถามเรื่องประสิทธิภาพ):
ประสิทธิภาพฉลาดขึ้นอยู่กับสภาพแวดล้อมของคุณ พิจารณาปัจจัยต่อไปนี้ในการตัดสินใจ:
คุณกำลังจะมองโลกในแง่ดีจะดีขึ้นเนื่องจากการเห็นพ้องในสถานการณ์ส่วนใหญ่ ทั้งนี้ขึ้นอยู่กับ RDBMS และสภาพแวดล้อมซึ่งอาจมีประสิทธิภาพน้อยลงหรือมากขึ้น โดยทั่วไปแล้วการล็อก Optimistic จะทำให้คุณพบว่าค่าจะต้องมีแถวเป็นเวอร์ชัน
ตัวอย่างเช่นด้วย MS SQL Server จะถูกย้ายไปยัง TempDB และบางสิ่งระหว่าง 12-14 ไบต์จะถูกต่อท้ายที่ท้ายคอลัมน์ การเปิดการล็อกในแง่ดีด้วยระดับการแยกเช่น Snapshot Isolation อาจทำให้เกิดการแตกแฟรกเมนต์และปัจจัยการเติมของคุณจะต้องได้รับการปรับเนื่องจากแถวตอนนี้มีข้อมูลเพิ่มเติมในตอนท้ายซึ่งอาจทำให้หน้าใกล้เต็มเพื่อทำให้เกิดการแยกหน้า ประสิทธิภาพของคุณ หาก TempDB ของคุณอยู่ภายใต้การปรับให้เหมาะสมสิ่งนี้จะไม่เร็วอย่างที่คิด
ดังนั้นฉันคิดว่ารายการตรวจสอบคือ:
- - คุณมี IO / ทรัพยากรเพียงพอที่จะจัดการกับรูปแบบของการกำหนดเวอร์ชันแถวหรือไม่? ถ้าไม่คุณกำลังเพิ่มค่าใช้จ่าย ถ้าเป็นเช่นนั้นถ้าคุณกำลังอ่านข้อมูลบ่อยครั้งในขณะที่คุณกำลังล็อคเพื่อเขียนคุณจะสังเกตเห็นการปรับปรุงที่ดีในการเกิดพร้อมกันในการอ่านและเขียน (แม้ว่าการเขียนจะยังคงบล็อกการเขียนการอ่านจะไม่ถูกบล็อกอีกต่อไป
- - รหัสของคุณไวต่อการหยุดชะงักหรือคุณประสบกับการล็อคหรือไม่ หากคุณไม่ประสบปัญหาการล็อคที่ยาวนานหรือการหยุดชะงักจำนวนมากค่าใช้จ่ายเพิ่มเติมของการล็อค Optimistic จะไม่ทำให้สิ่งต่าง ๆ เร็วขึ้นแน่นอนว่าในกรณีส่วนใหญ่เรากำลังพูดถึงมิลลิวินาที
- - ถ้าฐานข้อมูลของคุณมีขนาดใหญ่ (หรือบนฮาร์ดแวร์ที่ จำกัด มาก) และหน้าข้อมูลของคุณใกล้เต็มแล้วทั้งนี้ขึ้นอยู่กับ RDBMS คุณสามารถแยกหน้าหลักและแยกส่วนข้อมูลได้ดังนั้นควรพิจารณาทำดัชนีใหม่หลังจากเปิดใช้แล้ว
นี่คือความคิดของฉันในเรื่องนี้เปิดรับฟังมากขึ้นจากชุมชน