ฉันพยายามค้นหาข้อมูลบางอย่างเกี่ยวกับการบล็อกใน SQL Server แต่ไม่พบคำอธิบายที่กระชับสำหรับสิ่งที่เป็นและวิธีการที่เกิดขึ้น คุณช่วยบอกฉันทีได้ไหม
ฉันพยายามค้นหาข้อมูลบางอย่างเกี่ยวกับการบล็อกใน SQL Server แต่ไม่พบคำอธิบายที่กระชับสำหรับสิ่งที่เป็นและวิธีการที่เกิดขึ้น คุณช่วยบอกฉันทีได้ไหม
คำตอบ:
อุปมา
บางครั้งช่วยในการใช้การเปรียบเทียบกับคอมพิวเตอร์
สมมติว่าคุณมีลูกและลูกสองคน มีลูกเพียงคนเดียวที่สามารถมีลูกได้ตลอดเวลา อย่างไรก็ตามหากเด็กคนใดคนหนึ่งรับลูกบอลและไม่ปล่อยมันไปเพราะเขาวอกแวก (ดูทีวีเป็นต้น) เด็กคนอื่นจะไม่เล่นกับลูกบอล
ชายอีกคนหนึ่งถูกบล็อกจากทรัพยากรนั้น
หากเราเปรียบเทียบสิ่งนี้กับทีวีเด็ก ๆ หลายคนสามารถดูทีวีได้ทุกเมื่อ
ล็อค
หากเราย้ายไปยังโลกของฐานข้อมูลเราจะเห็นว่ามีวิธีการใช้ทรัพยากรที่แตกต่างกัน (เหมือนสองตัวอย่างข้างต้น) เราสามารถทำการ "อ่าน" หรือเราสามารถทำการ "เขียน"
เมื่อเราต้องการอ่านข้อมูลไม่มีเหตุผลที่คนอื่นไม่สามารถอ่านข้อมูลได้ - เช่นเดียวกับคนสองคนที่ดูทีวี อย่างไรก็ตามหากเราต้องการเขียนข้อมูลเราจำเป็นต้องตรวจสอบให้แน่ใจว่าไม่มีใครดูอยู่ หากพวกเขากำลังอ่านมันในขณะที่เรากำลังเขียนพวกเขาจะได้รับ "สกปรก" อ่าน (หมายความว่าพวกเขาจะเห็นข้อมูลถูกเขียนบางส่วนซึ่งจะไม่ถูกต้อง)
เพื่อให้มั่นใจว่าการอ่านที่สกปรกเหล่านี้จะไม่เกิดขึ้นเรามีการล็อคหลักสองประเภทคือ Read Locks และ Exclusive Locks
อ่านล็อค
คุณสามารถมีการเชื่อมต่อที่แตกต่างกันอ่านจากแหล่งข้อมูลเดียวกันในเวลาที่กำหนด แต่เพื่อให้มั่นใจว่าไม่มีใครเปลี่ยนแปลงข้อมูลนั้นในขณะที่พวกเขากำลังอ่านอยู่พวกเขาจะใช้ล็อกการอ่าน
เมื่อการเชื่อมต่อมีล็อกการอ่านบนชิ้นส่วนของข้อมูลแล้วการเชื่อมต่ออื่น ๆ ทั้งหมดจะต้องรอจนกว่าล็อกการอ่านจะออกก่อนที่พวกเขาจะสามารถเขียนข้อมูลได้ อย่างไรก็ตามคนอื่น ๆ สามารถนำ Read Locks ของตนเองไปใช้กับข้อมูลชิ้นเดียวกันได้
ล็อคพิเศษ
หากการเชื่อมต่อต้องการอัปเดต / แทรก / ลบข้อมูลส่วนหนึ่งพวกเขาจะต้องทำการล็อคแบบเอกสิทธิ์ วิธีนี้ช่วยป้องกันการเชื่อมต่ออื่น ๆ จากการล็อคข้อมูล (ทำให้การล็อคพิเศษสำหรับการเชื่อมต่อนั้น)
เมื่อการเชื่อมต่อมีการล็อคข้อมูลแบบเอกสิทธิ์เฉพาะบุคคลไม่มีการเชื่อมต่ออื่น ๆ ที่อาจอ่านจากข้อมูล สิ่งนี้จะช่วยป้องกันการอ่านที่สกปรกโดยรับประกันว่าไม่มีใครสามารถอ่านข้อมูลในขณะที่กำลังเขียน
การปิดกั้น
"การปิดกั้น" เป็นเพียงคำที่หมายถึงการเชื่อมต่อหนึ่งถือล็อคในทรัพยากรเมื่อการเชื่อมต่ออื่นต้องการที่จะอ่านหรือเขียนมัน ไม่ได้แปลว่าการเชื่อมต่อของเจ้าของจะไม่ปล่อย แต่เพียงแค่ในขณะนี้
เปรียบเทียบกรณีนี้กับเด็กที่ถือลูกบอล เด็กที่กำลังถือลูกบอลกำลังสกัดกั้นเด็กคนอื่น ๆ ไม่ให้ถือลูกบอล
การหยุดชะงัก
ฉันรู้ว่าคุณไม่ได้ถามสิ่งนี้ แต่เป็นอีกขั้นตอนเดียวที่จะไปสู่การหยุดชะงัก (และเกี่ยวข้องโดยตรงกับการบล็อก)
การหยุดชะงักสามารถเกิดขึ้นได้เมื่อคุณมีสองการเชื่อมต่อที่แต่ละคนมีการล็อค แต่พวกเขาต้องการทรัพยากรซึ่งกันและกัน ในสถานการณ์นี้มันเหมือนกับเด็กสองคนที่แต่ละคนมีลูก แต่ต้องการลูกบอลของอีกคน
เช่นเดียวกับเด็ก ๆ การเชื่อมต่อเหล่านี้ไม่เต็มใจที่จะแบ่งปันเลย แต่ละการเชื่อมต่อต้องการการเข้าถึงทรัพยากรทั้งสองเพื่อดำเนินการต่อ อย่างไรก็ตามพวกเขาอยู่ในสถานะของการปิดกั้นถาวร ในสถานะนี้ผู้ปกครอง (DBMS) จะต้องเข้ามาและเลือกผู้แพ้เพื่อให้หนึ่งในลูก (การเชื่อมต่อ) สามารถเข้าถึงทรัพยากรทั้งสองได้
เมื่อการเชื่อมต่อที่ "ชนะ" เสร็จสิ้นแล้วจะปล่อยทรัพยากรและจากนั้นการเชื่อมต่ออื่น ๆ ("แพ้") สามารถลองอีกครั้งเพื่อไปยังแหล่งข้อมูลทั้งสอง
ดังนั้นแนวคิดของการหยุดชะงักคือที่ที่คุณมีทรัพยากรสองอย่างที่บล็อกซึ่งกันและกัน
ที่นี่คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการล็อกประเภทต่าง ๆ ทั้งหมดของ SQL Server ที่มีให้และทรัพยากรต่าง ๆ ที่อาจทำให้เกิดการบล็อค / การหยุดชะงัก บทความเก่า แต่ก็ยังคงใช้กับ SQL Server 2000 ถึง 2008 R2 (มีการล็อกเพิ่มอีกไม่กี่ชนิดใน SQL Server รุ่นที่ใหม่กว่า แต่นั่นจะทำให้คุณเป็นจุดเริ่มต้น)
คำอธิบายที่ยอดเยี่ยมโดย Richard แต่เพียงต้องการเพิ่มลิงก์ไปยังเอกสารอย่างเป็นทางการ หัวข้อเหล่านี้เขียนขึ้นสำหรับ SQL Server 2000 แต่แนวคิดส่วนใหญ่ยังคงเหมือนเดิมในปัจจุบัน:
การทำความเข้าใจและหลีกเลี่ยงการบล็อก
ทำความเข้าใจเกี่ยวกับการล็อคใน SQL Server
แก้ไข - เพิ่มเติมบางส่วน:
Five Ways to Fight Blocking Video - วิดีโอสดใหม่จาก Kendra Little (เผยแพร่วันนี้)
DBA ในฐานะนักสืบ: การแก้ไขปัญหาการล็อคและการบล็อก - โดย Rodney Landrum
วิธีการระบุปัญหาการบล็อกด้วย SQL Profiler - โดย Brad McGehee
ทั้ง 3 เป็นผู้เขียน SQL Server และ / หรือ MVP ที่รู้จักกันดี