แบบสอบถามแบบเลือกอย่างง่ายได้รับการล็อกหรือไม่


14

ฉันใหม่มากกับ SQL Server และต้องการที่จะเข้าใจว่าต่อไปนี้selectคำสั่งที่ง่ายมากที่จะล็อคใด ๆ

Select * from Student;

โปรดพิจารณากรณีที่คำสั่งจะไม่ทำงานภายในbegin tranบล็อก


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

คำตอบ:


5

ใช่มันใช้การล็อคที่ใช้ร่วมกันในแถวที่อ่านตามค่าเริ่มต้น (นอกจากนี้ยังใช้การล็อคที่ใช้ร่วมกันที่ตั้งใจในทุกหน้าของดัชนีคลัสเตอร์ที่จะอ่าน) สิ่งนี้ทำเพื่อป้องกันการอ่านที่สกปรก อย่างไรก็ตามมีวิธีการข้ามนี้ (SQL Server มีคำใบ้ nolock) ถ้าคำสั่งไม่ได้อยู่ใน BEGIN TRAN การล็อกจะถูกปล่อยหลังจากคำสั่ง SELECT ทำงาน

ข้อมูลเพิ่มเติมสามารถดูได้ที่นี่:

http://msdn.microsoft.com/en-us/library/ms184286(v=sql.105).aspx http://www.sqlteam.com/article/introduction-to-locking-in-sql-server


นอกจากนี้คุณยังสามารถตั้งค่าระดับการแยกการทำธุรกรรมเพื่ออ่านปราศจากข้อผูกมัด
เชน

1
ดังนั้นถ้า SELECT อ่านสิบแถวจะมีการแชร์การล็อกสิบครั้งจนกว่าจะมีการอ่านทั้งสิบแถวหรือว่าพวกเขาได้รับและปล่อยต่อแถวหรือไม่
Ian Warburton

26

ฉันต้องการที่จะเข้าใจว่าต่อไปนี้คำสั่งเลือกง่ายมากจะใช้เวลาล็อคใด ๆ

เป็นความเข้าใจผิดที่พบโดยทั่วไปว่าSELECTแบบสอบถามที่เรียกใช้ที่READ COMMITTEDระดับการแยกธุรกรรมเริ่มต้นจะใช้การล็อกที่ใช้ร่วมกันเสมอเพื่อป้องกันการอ่านที่สกปรก

SQL Server สามารถหลีกเลี่ยงการล็อกระดับแถวที่ใช้ร่วมกันได้เมื่อไม่มีอันตรายจากการอ่านข้อมูลที่ไม่มีข้อผูกมัดโดยไม่มีการล็อค (แม้ว่าจะยังคงใช้การล็อก Intent-Shared (IS) ระดับสูงกว่าอยู่)

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

ในกรณีส่วนใหญ่แถวนั้นจะ 'ปลดล็อค' ก่อนที่เซิร์ฟเวอร์จะประมวลผลแถวถัดไป มีสถานการณ์ที่ใช้ร่วมกันล็อคถ่ายที่ระดับแยกเริ่มต้นที่จะมีขึ้นที่ส่วนท้ายของคำสั่งในปัจจุบันที่ส่วนท้ายของมี แต่ไม่ได้ทำธุรกรรม

เอาชนะระดับแยกในปัจจุบันมีNOLOCKคำใบ้ตารางมักจะเป็นความคิดที่ดี

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

SQL Server มีระดับการแยกที่หลากหลาย เลือกสิ่งที่ให้การรับรองและพฤติกรรมที่ข้อมูลของคุณต้องการ

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