การบล็อกคืออะไรและเกิดขึ้นได้อย่างไร


20

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

คำตอบ:


23

อุปมา

บางครั้งช่วยในการใช้การเปรียบเทียบกับคอมพิวเตอร์

สมมติว่าคุณมีลูกและลูกสองคน มีลูกเพียงคนเดียวที่สามารถมีลูกได้ตลอดเวลา อย่างไรก็ตามหากเด็กคนใดคนหนึ่งรับลูกบอลและไม่ปล่อยมันไปเพราะเขาวอกแวก (ดูทีวีเป็นต้น) เด็กคนอื่นจะไม่เล่นกับลูกบอล

ชายอีกคนหนึ่งถูกบล็อกจากทรัพยากรนั้น

หากเราเปรียบเทียบสิ่งนี้กับทีวีเด็ก ๆ หลายคนสามารถดูทีวีได้ทุกเมื่อ

ล็อค

หากเราย้ายไปยังโลกของฐานข้อมูลเราจะเห็นว่ามีวิธีการใช้ทรัพยากรที่แตกต่างกัน (เหมือนสองตัวอย่างข้างต้น) เราสามารถทำการ "อ่าน" หรือเราสามารถทำการ "เขียน"

เมื่อเราต้องการอ่านข้อมูลไม่มีเหตุผลที่คนอื่นไม่สามารถอ่านข้อมูลได้ - เช่นเดียวกับคนสองคนที่ดูทีวี อย่างไรก็ตามหากเราต้องการเขียนข้อมูลเราจำเป็นต้องตรวจสอบให้แน่ใจว่าไม่มีใครดูอยู่ หากพวกเขากำลังอ่านมันในขณะที่เรากำลังเขียนพวกเขาจะได้รับ "สกปรก" อ่าน (หมายความว่าพวกเขาจะเห็นข้อมูลถูกเขียนบางส่วนซึ่งจะไม่ถูกต้อง)

เพื่อให้มั่นใจว่าการอ่านที่สกปรกเหล่านี้จะไม่เกิดขึ้นเรามีการล็อคหลักสองประเภทคือ Read Locks และ Exclusive Locks

อ่านล็อค

คุณสามารถมีการเชื่อมต่อที่แตกต่างกันอ่านจากแหล่งข้อมูลเดียวกันในเวลาที่กำหนด แต่เพื่อให้มั่นใจว่าไม่มีใครเปลี่ยนแปลงข้อมูลนั้นในขณะที่พวกเขากำลังอ่านอยู่พวกเขาจะใช้ล็อกการอ่าน

เมื่อการเชื่อมต่อมีล็อกการอ่านบนชิ้นส่วนของข้อมูลแล้วการเชื่อมต่ออื่น ๆ ทั้งหมดจะต้องรอจนกว่าล็อกการอ่านจะออกก่อนที่พวกเขาจะสามารถเขียนข้อมูลได้ อย่างไรก็ตามคนอื่น ๆ สามารถนำ Read Locks ของตนเองไปใช้กับข้อมูลชิ้นเดียวกันได้

ล็อคพิเศษ

หากการเชื่อมต่อต้องการอัปเดต / แทรก / ลบข้อมูลส่วนหนึ่งพวกเขาจะต้องทำการล็อคแบบเอกสิทธิ์ วิธีนี้ช่วยป้องกันการเชื่อมต่ออื่น ๆ จากการล็อคข้อมูล (ทำให้การล็อคพิเศษสำหรับการเชื่อมต่อนั้น)

เมื่อการเชื่อมต่อมีการล็อคข้อมูลแบบเอกสิทธิ์เฉพาะบุคคลไม่มีการเชื่อมต่ออื่น ๆ ที่อาจอ่านจากข้อมูล สิ่งนี้จะช่วยป้องกันการอ่านที่สกปรกโดยรับประกันว่าไม่มีใครสามารถอ่านข้อมูลในขณะที่กำลังเขียน

การปิดกั้น

"การปิดกั้น" เป็นเพียงคำที่หมายถึงการเชื่อมต่อหนึ่งถือล็อคในทรัพยากรเมื่อการเชื่อมต่ออื่นต้องการที่จะอ่านหรือเขียนมัน ไม่ได้แปลว่าการเชื่อมต่อของเจ้าของจะไม่ปล่อย แต่เพียงแค่ในขณะนี้

เปรียบเทียบกรณีนี้กับเด็กที่ถือลูกบอล เด็กที่กำลังถือลูกบอลกำลังสกัดกั้นเด็กคนอื่น ๆ ไม่ให้ถือลูกบอล

การหยุดชะงัก

ฉันรู้ว่าคุณไม่ได้ถามสิ่งนี้ แต่เป็นอีกขั้นตอนเดียวที่จะไปสู่การหยุดชะงัก (และเกี่ยวข้องโดยตรงกับการบล็อก)

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

เช่นเดียวกับเด็ก ๆ การเชื่อมต่อเหล่านี้ไม่เต็มใจที่จะแบ่งปันเลย แต่ละการเชื่อมต่อต้องการการเข้าถึงทรัพยากรทั้งสองเพื่อดำเนินการต่อ อย่างไรก็ตามพวกเขาอยู่ในสถานะของการปิดกั้นถาวร ในสถานะนี้ผู้ปกครอง (DBMS) จะต้องเข้ามาและเลือกผู้แพ้เพื่อให้หนึ่งในลูก (การเชื่อมต่อ) สามารถเข้าถึงทรัพยากรทั้งสองได้

เมื่อการเชื่อมต่อที่ "ชนะ" เสร็จสิ้นแล้วจะปล่อยทรัพยากรและจากนั้นการเชื่อมต่ออื่น ๆ ("แพ้") สามารถลองอีกครั้งเพื่อไปยังแหล่งข้อมูลทั้งสอง

ดังนั้นแนวคิดของการหยุดชะงักคือที่ที่คุณมีทรัพยากรสองอย่างที่บล็อกซึ่งกันและกัน


ที่นี่คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการล็อกประเภทต่าง ๆ ทั้งหมดของ SQL Server ที่มีให้และทรัพยากรต่าง ๆ ที่อาจทำให้เกิดการบล็อค / การหยุดชะงัก บทความเก่า แต่ก็ยังคงใช้กับ SQL Server 2000 ถึง 2008 R2 (มีการล็อกเพิ่มอีกไม่กี่ชนิดใน SQL Server รุ่นที่ใหม่กว่า แต่นั่นจะทำให้คุณเป็นจุดเริ่มต้น)


1
@Richard ตามที่คุณได้กล่าวไว้หากมีการหยุดชะงักเกิดขึ้นแล้ว DBMS จะเข้ามาและเลือกผู้แพ้ .. สิ่งนี้จะทำโดยอัตโนมัติโดย DBMS หรือไม่? หรือระบบที่ได้รับการออกแบบมาไม่ดี (ระบบที่มักมีปัญหาการหยุดชะงัก) จะหยุดจนกว่าคน ๆ หนึ่งจะเริ่มทำ DBMS ให้ทำเช่นนั้น?
CenterOrbit

2
สำหรับ SQL Server จะดำเนินการโดยอัตโนมัติ (หากฐานข้อมูลสามารถตรวจพบการหยุดชะงัก ) มันอาจมีปัญหาในการตรวจสอบว่ามันเป็นล็อคจริงหรือไม่
ริชาร์ด

Richard เป็นคำตอบที่ยอดเยี่ยมและละเอียดรอบคอบมาก หนึ่งจุดเพิ่มเติมของ live lock (ซึ่งไม่ควรนำมาเปรียบเทียบหรือเกี่ยวข้องกับ deadlocks มันเป็นการบล็อกเก่าแบบธรรมดา) ... SQL จะป้องกันการล็อกเพิ่มเติมที่ถูกล็อกแบบเอกสิทธิ์เฉพาะบุคคลที่กำลังรออยู่ IIRC หลังจาก 4 ล็อคที่ซ้อนกันต่อเนื่องกัน
Mark Storey-Smith

5

คำอธิบายที่ยอดเยี่ยมโดย Richard แต่เพียงต้องการเพิ่มลิงก์ไปยังเอกสารอย่างเป็นทางการ หัวข้อเหล่านี้เขียนขึ้นสำหรับ SQL Server 2000 แต่แนวคิดส่วนใหญ่ยังคงเหมือนเดิมในปัจจุบัน:

การทำความเข้าใจและหลีกเลี่ยงการบล็อก

ทำความเข้าใจเกี่ยวกับการล็อคใน SQL Server

แก้ไข - เพิ่มเติมบางส่วน:

ทั้ง 3 เป็นผู้เขียน SQL Server และ / หรือ MVP ที่รู้จักกันดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.