Có một truy vấn chọn đơn giản có được khóa?


13

Tôi rất mới với SQL Server và muốn hiểu liệu selectcâu lệnh đơn giản sau đây có thực hiện bất kỳ khóa nào không.

Select * from Student;

Vui lòng xem xét trường hợp câu lệnh sẽ không chạy trong một begin trankhối.


1
Đây là một câu hỏi phức tạp hơn nhiều so với bạn nghĩ. Câu trả lời phụ thuộc vào nhiều điều (mức cô lập giao dịch phiên là gì? Đã đọc cách ly ảnh chụp nhanh đã cam kết chưa? Chỉ mục được quét có các tùy chọn được đặt để ngăn khóa hàng hoặc khóa trang không?) Và thậm chí có thể thay đổi trong khi chạy câu lệnh (bao nhiêu các hàng nằm trong bảng? bảng có được phân vùng không?). Đây là một điểm tốt để bắt đầu đọc.
Jon Seigel

Câu trả lời:


5

Có, nó có một khóa chia sẻ trên các hàng mà nó đọc theo mặc định (nó cũng có một khóa chia sẻ ý định trên tất cả các trang của chỉ mục được nhóm mà nó sẽ đọc), điều này được thực hiện để ngăn chặn việc đọc bẩn. Tuy nhiên, có nhiều cách để bỏ qua điều này (SQL Server có gợi ý nolock). Nếu câu lệnh không nằm trong BEGIN TRAN, khóa sẽ được giải phóng sau khi câu lệnh SELECT chạy.

Thông tin thêm có thể được tìm thấy ở đây:

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


Ngoài ra, bạn cũng có thể đặt mức cô lập giao dịch để đọc không cam kết.
Zane

1
Vì vậy, nếu CHỌN đọc mười hàng, mười khóa được chia sẻ được giữ cho đến khi tất cả mười hàng đã được đọc hoặc chúng được thu thập và phát hành trên mỗi hàng?
Ian Warburton

25

Tôi muốn hiểu liệu sau đây, câu lệnh chọn rất đơn giản sẽ có bất kỳ khóa nào không

Một quan niệm sai lầm phổ biến là một SELECTtruy vấn chạy ở READ COMMITTEDmức cô lập giao dịch mặc định sẽ luôn lấy các khóa được chia sẻ để ngăn việc đọc bẩn.

SQL Server có thể tránh thực hiện các khóa cấp độ hàng được chia sẻ khi không có nguy cơ đọc dữ liệu không được cam kết mà không có chúng (mặc dù các khóa Intent-Shared (IS) cấp cao hơn vẫn được thực hiện).

Ngay cả khi các khóa hàng chia sẻ được thực hiện (có lẽ vì một giao dịch đồng thời khác đã sửa đổi trang được bật), chúng có thể được phát hành từ lâu trước khi SELECTtuyên bố hoàn tất.

Trong hầu hết các trường hợp, hàng được 'mở khóa' ngay trước khi máy chủ xử lý hàng tiếp theo. Có những trường hợp trong đó các khóa chia sẻ được thực hiện ở mức cô lập mặc định được giữ ở cuối câu lệnh hiện tại, nhưng không đến cuối giao dịch .

Ghi đè mức cô lập hiện tại với NOLOCKgợi ý bảng hầu như luôn là một ý tưởng tồi .

Khóa là một chi tiết thực hiện. SQL Server có các khóa khi cần thiết để đảm bảo đáp ứng các đảm bảo ngữ nghĩa được cung cấp bởi mức cô lập hiện tại . Chắc chắn có những lúc rất hữu ích để biết một chút về lý do tại sao các khóa được thực hiện, nhưng cố gắng dự đoán chúng là rất thường phản tác dụng.

SQL Server cung cấp nhiều mức độ cách ly khác nhau; chọn một trong đó cung cấp sự đảm bảo và hành vi mà người tiêu dùng dữ liệu của bạn cần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.