Nếu máy khách mất nhiều thời gian để nhận dữ liệu và lần lượt gửi xác nhận đến SQL Server rằng nó đã nhận được dữ liệu SQL Server phải chờ, do chờ đợi này, SQL Server sẽ không giải phóng các khóa được giữ bởi truy vấn trừ khi nhận được xác nhận từ máy khách.
Điều này là không chính xác, nó phụ thuộc vào mức độ cô lập.
Tại các READ COMMITTED
khóa mặc định không được giữ trong suốt thời gian thực hiện câu lệnh. READ COMMITTED
không cung cấp tính nhất quán đọc mức độ tuyên bố, bảo đảm duy nhất là bạn không thể đọc dữ liệu không được cam kết. Một khóa chia sẻ được mua và giữ để đọc hàng và sau đó phát hành.
Trừ khi bạn có các loại LOB.
Các loại LOB, có khả năng rất lớn, không thể được đệm. Một khóa chia sẻ phải được mua và giữ cho đến khi câu lệnh hoàn thành, về cơ bản mang lại cho bạn REPEATABLE READ
hành vi tại READ COMMITTED
.
Nếu tôi đang thực hiện một cuộc gọi đến cơ sở dữ liệu MSSQL qua mạng có độ trễ cao, liệu khóa bảng có xảy ra do độ trễ đó không?
Độ trễ không gây ra khóa bảng, không. Tuy nhiên, nếu khóa bảng đã được mua, độ trễ sẽ kéo dài nó.
Để trích dẫn ai đó biết cơ chế này tốt hơn tôi ( @RemusRusanu ):
Kết quả được trả về chương trình máy khách khi tiến hành thực hiện. Khi các hàng 'bong bóng' lên cây thực thi, toán tử trên cùng thường được giao nhiệm vụ ghi các hàng này vào bộ đệm mạng và gửi chúng trở lại máy khách. Kết quả không được tạo trước tiên vào một số bộ lưu trữ trung gian (bộ nhớ hoặc đĩa) và sau đó được gửi lại cho máy khách, thay vào đó nó được gửi lại như đang được tạo (khi truy vấn thực thi). Gửi kết quả trở lại máy khách, tất nhiên, phải tuân theo giao thức kiểm soát luồng mạng. Nếu máy khách không chủ động tiêu thụ kết quả (ví dụ: bằng cách gọi SqlDataReader.Read ()) thì cuối cùng, điều khiển luồng sẽ phải chặn phía gửi (truy vấn đang được thực thi) và đến lượt nó sẽ tạm dừng việc thực thi truy vấn.[nguồn]
Trường hợp kết quả không được tiêu thụ nhanh như SQL Server có thể phân phối chúng, do máy khách hoặc mạng, chúng tôi thấy sự ASYNC_NETWORK_IO
chờ đợi tích lũy. Để nhắc lại, điều này sẽ không ảnh hưởng đến các khóa được mua, chỉ là thời lượng chúng được giữ.
nolock
gợi ý, sẽ luôn có một khóa . Độ trễ chỉ xác định thời gian khóa sẽ được giữ.