หากลูกค้าใช้เวลานานในการรับข้อมูลและส่งการตอบรับไปยัง SQL Server ว่าได้รับข้อมูลจาก SQL Server แล้วต้องรอเนื่องจากการรอนี้ SQL Server จะไม่ปล่อยการล็อกที่เก็บไว้โดยแบบสอบถามเว้นแต่ว่าจะได้รับการตอบรับจากลูกค้า
มันไม่ถูกต้องมันขึ้นอยู่กับระดับการแยก
ที่READ COMMITTED
ล็อคเริ่มต้นจะไม่ถูกเก็บไว้ในช่วงระยะเวลาของการดำเนินการคำสั่ง READ COMMITTED
ไม่ได้จัดเตรียมความสอดคล้องในการอ่านระดับคำสั่งผู้รับประกันเพียงคนเดียวคือคุณไม่สามารถอ่านข้อมูลที่ไม่มีข้อผูกมัดได้ ล็อคที่ใช้ร่วมกันจะได้รับและเก็บไว้เพื่ออ่านแถวแล้วปล่อย
ถ้าคุณไม่มีประเภท LOB
ประเภท LOB ซึ่งมีขนาดใหญ่มากอาจไม่สามารถบัฟเฟอร์ได้ ล็อคที่ใช้ร่วมกันจะต้องมีการซื้อและถือจนเสร็จสมบูรณ์คำสั่งเป็นหลักให้คุณพฤติกรรมที่REPEATABLE READ
READ COMMITTED
ถ้าฉันโทรไปยังฐานข้อมูล MSSQL เพียงครั้งเดียวบนเครือข่ายที่มีความหน่วงสูงการล็อคตารางจะเกิดขึ้นเนื่องจากเวลาในการตอบสนองนั้นหรือไม่
เวลาแฝงไม่ได้ทำให้ล็อคตารางไม่ อย่างไรก็ตามหากล็อคตารางได้รับความหน่วงแฝงจะยืดออก
หากต้องการอ้างถึงคนที่รู้จักกลไกของสิ่งนี้ดีกว่าฉัน ( @RemusRusanu ):
ผลลัพธ์จะถูกส่งกลับไปยังโปรแกรมไคลเอนต์เมื่อการดำเนินการดำเนินการ ในฐานะที่เป็น 'ฟอง' แถวของต้นไม้การดำเนินงานผู้ประกอบการด้านบนมักจะได้รับมอบหมายด้วยการเขียนแถวเหล่านี้ลงในบัฟเฟอร์เครือข่ายและส่งพวกเขากลับไปยังลูกค้า ผลลัพธ์จะไม่ถูกสร้างขึ้นในที่เก็บข้อมูลระดับกลาง (หน่วยความจำหรือดิสก์) ก่อนแล้วจึงส่งกลับไปยังไคลเอนต์ แต่จะถูกส่งกลับไปตามที่สร้างขึ้น แน่นอนว่าการส่งผลลัพธ์กลับไปยังไคลเอนต์นั้นขึ้นอยู่กับโปรโตคอลควบคุมการไหลของเครือข่าย หากลูกค้าไม่ได้ใช้ผลลัพธ์อย่างแข็งขัน (เช่นการเรียก SqlDataReader.Read ()) ในที่สุดการควบคุมการไหลจะต้องปิดกั้นด้านการส่ง (แบบสอบถามที่กำลังดำเนินการ) และสิ่งนี้จะระงับการดำเนินการของ สอบถาม[แหล่ง]
ในกรณีที่ผลลัพธ์ไม่ได้ถูกใช้อย่างรวดเร็วที่สุดเท่าที่ SQL Server สามารถส่งมอบได้ไม่ว่าจะเกิดจากลูกค้าหรือเครือข่ายเราเห็นว่าASYNC_NETWORK_IO
กำลังรอการสะสมอยู่ เพื่อย้ำอีกครั้งสิ่งนี้จะไม่ส่งผลต่อการล็อคที่ได้มาเพียงระยะเวลาที่พวกมันถูกเก็บไว้
nolock
คำใบ้จะมีการล็อคเสมอ เวลาในการตอบสนองจะเป็นตัวกำหนดระยะเวลาของการล็อค