Khóa chia sẻ được phát hành trên IsolationLevel.ReadUncommned


10

Tôi đọc rằng nếu tôi sử dụng IsolationLevel.ReadUncommned, truy vấn sẽ không đưa ra bất kỳ khóa nào. Tuy nhiên, khi tôi kiểm tra điều này, tôi đã thấy khóa sau:

Resource_Type: HOBT
Request_Mode: S (Được chia sẻ)

Khóa HOBT là gì? Một cái gì đó liên quan đến HBT (Heap hoặc Binary Tree lock)?

Tại sao tôi vẫn nhận được khóa S?

Làm cách nào để tránh khóa chia sẻ khi truy vấn mà không bật tùy chọn chụp nhanh mức cô lập?

Tôi đang thử nghiệm điều này trên SQLServer 2008 và tùy chọn ảnh chụp nhanh được đặt thành tắt. Các truy vấn chỉ thực hiện một lựa chọn.

Tôi có thể thấy rằng Sch-S là bắt buộc, mặc dù SQL Server dường như không hiển thị nó trong truy vấn khóa của tôi. Tại sao nó vẫn phát hành Khóa chung? Dựa theo:

THIẾT LẬP CẤP PHÂN TÍCH GIAO DỊCH (Transact-SQL)

Các giao dịch chạy ở READ UNCOMMITTEDcấp độ không phát hành các khóa được chia sẻ để ngăn các giao dịch khác sửa đổi dữ liệu được đọc bởi giao dịch hiện tại.

Vì vậy tôi hơi bối rối.

Câu trả lời:


13

Khóa HOBT là gì?

Khóa bảo vệ cây B (chỉ mục) hoặc các trang dữ liệu heap trong bảng không có chỉ mục được nhóm.

Tại sao tôi vẫn nhận được khóa S?

Điều này xảy ra trên đống. Thí dụ

SET NOCOUNT ON;

DECLARE @Query nvarchar(max) = 
   N'DECLARE @C INT; 
     SELECT @C = COUNT(*) FROM master.dbo.MSreplication_options';

/*Run once so compilation out of the way*/
EXEC(@Query);

DBCC TRACEON(-1,3604,1200) WITH NO_INFOMSGS;

PRINT 'READ UNCOMMITTED';
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
EXEC(@Query);

PRINT 'READ COMMITTED';
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
EXEC(@Query);

DBCC TRACEOFF(-1,3604,1200) WITH NO_INFOMSGS;

Đầu ra READ UNCOMMITTED

Process 56 acquiring Sch-S lock on OBJECT: 1:1163151189:0  (class bit0 ref1) result: OK

Process 56 acquiring S lock on HOBT: 1:72057594038910976 [BULK_OPERATION] (class bit0 ref1) result: OK

Process 56 releasing lock on OBJECT: 1:1163151189:0 

Đầu ra READ COMMITTED

Process 56 acquiring IS lock on OBJECT: 1:1163151189:0  (class bit0 ref1) result: OK

Process 56 acquiring IS lock on PAGE: 1:1:169 (class bit0 ref1) result: OK

Process 56 releasing lock on PAGE: 1:1:169

Process 56 releasing lock on OBJECT: 1:1163151189:0 

Theo bài viết này tham khảo Paul Randal, lý do để sử dụng BULK_OPERATIONkhóa HOBT được chia sẻ này là để ngăn việc đọc các trang không được định dạng.


5

Mức cô lập ReadUncommned không có được khóa. Khóa ổn định lược đồ ngăn các đối tượng bị truy vấn bị thay đổi trong khi truy vấn thực thi. Khóa này được thu thập dưới tất cả các mức cô lập, bao gồm snapshot và read_commned_snapshot (RCSI). Từ chế độ khóa :

Khóa Schema

Công cụ cơ sở dữ liệu sử dụng các khóa sửa đổi lược đồ (Sch-M) trong hoạt động ngôn ngữ định nghĩa dữ liệu bảng (DDL), chẳng hạn như thêm một cột hoặc thả bảng. Trong thời gian được giữ, khóa Sch-M ngăn chặn truy cập đồng thời vào bảng. Điều này có nghĩa là khóa Sch-M chặn tất cả các hoạt động bên ngoài cho đến khi khóa được giải phóng.

Một số hoạt động ngôn ngữ thao tác dữ liệu (DML), chẳng hạn như cắt bảng, sử dụng khóa Sch-M để ngăn truy cập vào các bảng bị ảnh hưởng bởi các hoạt động đồng thời.

Công cụ cơ sở dữ liệu sử dụng các khóa ổn định lược đồ (Sch-S) khi biên dịch và thực hiện các truy vấn. Khóa Sch-S không chặn bất kỳ khóa giao dịch nào, kể cả khóa độc quyền (X). Do đó, các giao dịch khác, bao gồm các giao dịch có khóa X trên bảng, tiếp tục chạy trong khi truy vấn đang được biên dịch. Tuy nhiên, các hoạt động DDL đồng thời và các hoạt động DML đồng thời có được các khóa Sch-M, không thể được thực hiện trên bảng.

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.