ฉันใหม่มากกับ SQL Server และต้องการที่จะเข้าใจว่าต่อไปนี้select
คำสั่งที่ง่ายมากที่จะล็อคใด ๆ
Select * from Student;
โปรดพิจารณากรณีที่คำสั่งจะไม่ทำงานภายในbegin tran
บล็อก
ฉันใหม่มากกับ SQL Server และต้องการที่จะเข้าใจว่าต่อไปนี้select
คำสั่งที่ง่ายมากที่จะล็อคใด ๆ
Select * from Student;
โปรดพิจารณากรณีที่คำสั่งจะไม่ทำงานภายในbegin tran
บล็อก
คำตอบ:
ใช่มันใช้การล็อคที่ใช้ร่วมกันในแถวที่อ่านตามค่าเริ่มต้น (นอกจากนี้ยังใช้การล็อคที่ใช้ร่วมกันที่ตั้งใจในทุกหน้าของดัชนีคลัสเตอร์ที่จะอ่าน) สิ่งนี้ทำเพื่อป้องกันการอ่านที่สกปรก อย่างไรก็ตามมีวิธีการข้ามนี้ (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
ฉันต้องการที่จะเข้าใจว่าต่อไปนี้คำสั่งเลือกง่ายมากจะใช้เวลาล็อคใด ๆ
เป็นความเข้าใจผิดที่พบโดยทั่วไปว่าSELECT
แบบสอบถามที่เรียกใช้ที่READ COMMITTED
ระดับการแยกธุรกรรมเริ่มต้นจะใช้การล็อกที่ใช้ร่วมกันเสมอเพื่อป้องกันการอ่านที่สกปรก
SQL Server สามารถหลีกเลี่ยงการล็อกระดับแถวที่ใช้ร่วมกันได้เมื่อไม่มีอันตรายจากการอ่านข้อมูลที่ไม่มีข้อผูกมัดโดยไม่มีการล็อค (แม้ว่าจะยังคงใช้การล็อก Intent-Shared (IS) ระดับสูงกว่าอยู่)
แม้ว่าการล็อกแถวที่ใช้ร่วมกันนั้นจะเกิดขึ้น (อาจเป็นเพราะธุรกรรมอื่นที่เกิดขึ้นพร้อมกันได้มีการปรับเปลี่ยนหน้าเพจที่เปิดอยู่) พวกเขาสามารถปล่อยได้นานก่อนที่SELECT
คำสั่งจะเสร็จสมบูรณ์
ในกรณีส่วนใหญ่แถวนั้นจะ 'ปลดล็อค' ก่อนที่เซิร์ฟเวอร์จะประมวลผลแถวถัดไป มีสถานการณ์ที่ใช้ร่วมกันล็อคถ่ายที่ระดับแยกเริ่มต้นที่จะมีขึ้นที่ส่วนท้ายของคำสั่งในปัจจุบันที่ส่วนท้ายของมี แต่ไม่ได้ทำธุรกรรม
เอาชนะระดับแยกในปัจจุบันมีNOLOCK
คำใบ้ตารางมักจะเป็นความคิดที่ดี
การล็อคคือรายละเอียดการนำไปปฏิบัติ SQL Server ใช้เวลาล็อคเมื่อมีความจำเป็นเพื่อให้แน่ใจว่ามันเป็นไปตามความหมายของการค้ำประกันให้โดยปัจจุบันระดับการแยก มีหลายครั้งที่มีประโยชน์ที่จะรู้เพียงเล็กน้อยว่าทำไมการล็อคจึงถูกนำมาใช้
SQL Server มีระดับการแยกที่หลากหลาย เลือกสิ่งที่ให้การรับรองและพฤติกรรมที่ข้อมูลของคุณต้องการ