เรามักพบสถานการณ์นี้ในฐานข้อมูล: ตารางหลัก A และตารางย่อย B ตาราง B มีคีย์หลักของตาราง A เป็นคีย์นอก เมื่อเราต้องการแทรกข้อมูล ก่อนอื่นเราจะแทรกลงในตาราง A จากนั้นรับข้อมูลประจำตัวของตาราง A จากนั้นจึงแทรกลงในตาราง B หากคุณต้องการดำเนินการลบ ให้ลบตารางย่อย B ก่อน จากนั้นจึงลบตารางหลัก A ในการเขียนโปรแกรม การดำเนินการบนทั้งสองตารางจะเสร็จสมบูรณ์ในธุรกรรมเดียว
เมื่อมีการใช้ระบบบ่อยครั้ง การดำเนินการแทรกและการลบอาจเกิดขึ้นพร้อมกัน ในเวลานี้ ธุรกรรมการแทรกจะวางการล็อกแบบเอกสิทธิ์เฉพาะบุคคลในตารางหลัก A ก่อน จากนั้นจึงเข้าถึงตารางย่อย B ในเวลาเดียวกัน ธุรกรรมการลบจะวางการล็อกแบบเอกสิทธิ์เฉพาะบุคคลในตารางย่อย B จากนั้น เข้าถึงตารางหลัก A ธุรกรรมการแทรกจะผูกขาดตาราง A เสมอ โดยรอการเข้าถึงตาราง B และธุรกรรมการลบจะผูกขาดตาราง B ด้วย รอการเข้าถึงตาราง A ดังนั้นธุรกรรมทั้งสองจะผูกขาดตารางซึ่งกันและกัน โดยรอให้อีกฝ่ายปล่อย ทรัพยากรซึ่งทำให้เกิดการหยุดชะงัก
ฉันได้ยินมาว่ามีสามวิธีในการทำเช่นนี้:
1. ยกเลิกความสัมพันธ์ของคีย์นอกระหว่างสองตาราง AB เพื่อว่าเมื่อลบข้อมูล คุณสามารถลบตารางหลัก A ก่อน จากนั้นจึงลบตารางย่อย B เพื่อให้ ลำดับการเข้าถึงธุรกรรมของการดำเนินการทั้งสองตารางนี้สอดคล้องกัน
2 ก่อนที่จะลบข้อมูลในตาราง A ขั้นแรกให้ใช้ธุรกรรมเพื่อชี้คีย์ต่างประเทศที่เกี่ยวข้องในตาราง B ไปยังข้อมูลอื่นในตาราง A (เช่น สร้างแถวข้อมูลในตาราง A และตั้งค่าคีย์หลักเป็น 0 แถวนี้ ของข้อมูลจะไม่สามารถเข้าถึงได้ ดำเนินการลบ) ซึ่งจะช่วยลดความสัมพันธ์ระหว่างข้อมูลที่จะลบในทั้งสองตาราง AB จากนั้นคุณสามารถใช้ธุรกรรมการลบเพื่อลบข้อมูลในตาราง A ก่อน จากนั้นจึงลบข้อมูลในตาราง B เพื่อให้สามารถเข้าถึงตารางที่สอดคล้องกับธุรกรรมการแทรก และหลีกเลี่ยงการหยุดชะงัก
3. ในความสัมพันธ์ของคีย์นอก ให้ตั้งค่า "กฎการลบ" เป็น "การเรียงซ้อน" เพื่อให้ธุรกรรมการลบจำเป็นต้องลบตารางหลัก A โดยตรง โดยไม่ต้องดำเนินการกับตารางย่อย B เนื่องจากหลังจากตั้งค่ากฎการลบเป็นแบบเรียงซ้อนแล้ว ข้อมูลในตารางหลักจะถูกลบ และข้อมูลทั้งหมดที่เกี่ยวข้องกับคีย์นอกในตารางย่อยก็จะถูกลบในเวลาเดียวกันด้วย
วิธีแก้ปัญหาทั้งสามข้อข้างต้นล้วนเป็นข้อเสนอแนะจากเพื่อนร่วมงาน และฉันไม่รู้ว่าควรใช้วิธีใด
ฉันสงสัยว่ามีวิธีอื่นใดที่ดีในการป้องกันการหยุดชะงักในสถานการณ์นี้หรือไม่?
http://www.cnblogs.com/studyzy/archive/2007/06/11/779811.html