การเพิ่มล็อคคืออะไร?


47

ฉันถูกถามคำถามนี้ในการสัมภาษณ์และไม่มีคำตอบ ทุกคนที่นี่สามารถอธิบายได้หรือไม่

คำตอบ:


45

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

มันจะทำสิ่งนี้โดยอัตโนมัติแม้ว่าคุณสามารถตั้งค่าสถานะบนตาราง (ดู ALTER TABLE ในหนังสือบนบรรทัด) เพื่อควบคุมนโยบายสำหรับการเพิ่มระดับการล็อกบนตารางนั้น โดยเฉพาะอย่างยิ่งการเลื่อนระดับการล็อกก่อนกำหนดหรือมากเกินไปที่เคยเป็นปัญหากับ Sybase และ SQL Server เวอร์ชันเก่าเมื่อคุณมีกระบวนการสองกระบวนการที่เขียนแถวแยกกันในหน้าเดียวกันพร้อมกัน หากคุณย้อนกลับไปไกลพอ (IIRC SQL Server 6.5) SQL Server ไม่มีการล็อกแถว แต่จริง ๆ แล้วสามารถล็อคตารางหรือหน้าได้เท่านั้น เมื่อสิ่งนี้เกิดขึ้นคุณจะได้รับความขัดแย้งระหว่างส่วนแทรกของบันทึกในหน้าเดียวกัน บ่อยครั้งที่คุณจะใส่ดัชนีคลัสเตอร์ในตารางเพื่อแทรกใหม่ไปยังหน้าต่างๆ


3
ควรสังเกตว่าเราไม่สามารถควบคุมได้เมื่อเซิร์ฟเวอร์บานปลาย

เราทำแล้ว เรียกว่า T1211
Joshua

@Joshua ใช้ค่าสถานะการติดตาม 1211 เพื่อปิดใช้งานการเลื่อนระดับการล็อก ไม่มีทางที่เราจะบอกให้ SQL Server บานปลายในเวลาที่กำหนด
แค่ผู้เรียน

10
การล็อคแถวจะไม่เลื่อนระดับไปยัง Page Locks แต่จะเพิ่มลงในล็อกโดยตรงของตาราง
Manoj Pandey

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

20

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

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


11

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

  • ล็อคแถวจะเลื่อนระดับเป็นล็อคตารางเสมอและ
  • การล็อคหน้าจะเพิ่มขึ้นเป็นล็อคตาราง

เป็นตำนานที่ว่าการล็อกแถวถูกเลื่อนระดับเป็นหน้าล็อกตามที่กล่าวไว้ข้างต้นโดย @ConcernedOfTunbridgeWells ผิด

หากตารางมีแถวที่มีการอัพเดทน้อยมากโปรแกรมเอ็นจิน SQL จะลองใช้ Row-Lock ในแถวเหล่านั้นหรือล็อคหน้าในหน้าเหล่านั้น สมมติว่ามันใช้ Row-Lock แต่ถ้าการอัพเดทแถวเพิ่มขีด จำกัด (~ 5k ล็อค) ดังนั้นแทนที่จะใช้การล็อคแถวหลายครั้งมันจะล็อคตารางเดียว ดังนั้นสิ่งนี้จะช่วยลดค่าใช้จ่ายของหน่วยความจำโดยการปล่อย Row-Lock หลาย ๆ อันและใช้ Table-Lock เพียงอันเดียว แต่เพิ่มการทำงานพร้อมกัน เกิดขึ้นได้เหมือนกันกับการล็อกหน้า

เกณฑ์ล็อกเป็นที่อย่างน้อย 5000 ล็อคและขึ้นอยู่กับปัจจัยหลายประการคำอธิบายรายละเอียดของล็อกได้รับการกล่าวถึงที่นี่ใน MSDN BOL: https://technet.microsoft.com/en-us/library/ms184286(v = sql.105) .aspx


5

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

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