Mức cô lập tuần tự hóa của SQL Server có khóa toàn bộ bảng không


9

Tôi và một đồng nghiệp của tôi đã thảo luận về ý nghĩa của việc sử dụng mức cô lập nối tiếp. Anh ta nói rằng nó đã khóa toàn bộ bảng, nhưng tôi không đồng ý với việc nói với anh ta rằng nó có khả năng nhưng nó cố gắng áp dụng các khóa phạm vi và nó không áp dụng tuần tự hóa thực sự như được giải thích ở đây: Cấp độ cách ly nối tiếp .

Tôi không thể tìm thấy bất cứ điều gì trong các tài liệu cho "khóa toàn bộ bảng": THIẾT LẬP CẤP PHÂN PHỐI GIAO DỊCH .

Tài liệu nêu một loạt các điều liên quan đến khóa phạm vi, vì vậy về mặt lý thuyết bạn có thể khóa toàn bộ bảng bằng cách chỉ cần khóa phạm vi khóa toàn bộ phạm vi của các giá trị có thể có trong bảng, nhưng nó không khóa bảng.

Tôi hoàn toàn sai ở đây? Nó trong thực tế có khóa toàn bộ bảng (hoặc bảng) không?

Câu trả lời:


16

Nâng cao, mặc dù

Khóa leo thang dưới mức cách ly nối tiếp có thể xảy ra giống như với các mức cách ly khác.

  • Chỉ số chính xác có thể giúp tránh leo thang khóa đến một điểm
  • Khóa nhiều chỉ số sẽ làm tăng khả năng leo thang khóa; số lượng được tích lũy trên các đối tượng cho một câu lệnh

Một số ví dụ nhanh sử dụng một bảng duy nhất với một chỉ mục duy nhất. Id là khóa chính và chỉ mục được nhóm trên bảng.

Một hàng

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN

UPDATE c
SET c.Score = 2147483647 
FROM dbo.Comments AS c
WHERE c.Id = 138; --One value

ROLLBACK

Đối với một giá trị Id duy nhất, khóa là tối thiểu.

+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| RangeX-X     | Comments      | KEY           |           1 |
| IX           | Comments      | OBJECT        |           1 |
| IX           | Comments      | PAGE          |           1 |
+--------------+---------------+---------------+-------------+

Nhiều hàng

Nhưng khóa sẽ tăng nếu chúng ta bắt đầu làm việc trong phạm vi:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN

UPDATE c
SET c.Score = 2147483647 
FROM dbo.Comments AS c
WHERE c.Id BETWEEN 1 AND 5000; -- Small range

ROLLBACK

Bây giờ chúng tôi có nhiều khóa độc quyền hơn trên nhiều khóa:

+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| RangeX-X     | Comments      | KEY           |        2429 |
| IX           | Comments      | OBJECT        |           1 |
| IX           | Comments      | PAGE          |          97 |
+--------------+---------------+---------------+-------------+

Cách nhiều hàng

Điều này sẽ tiếp tục cho đến khi chúng tôi đạt đến điểm bùng phát:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN

UPDATE c
SET c.Score = 2147483647 
FROM dbo.Comments AS c
WHERE c.Id BETWEEN 1 AND 11655; --Larger range

ROLLBACK

Khóa leo thang được thử và thành công:

+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| X            | Comments      | OBJECT        |           1 |
+--------------+---------------+---------------+-------------+

Chú ý

Điều quan trọng là phải tách hai khái niệm ở đây: mức cô lập sẽ được tuần tự hóa cho dù loại khóa nào được thực hiện. Truy vấn chọn mức cô lập và công cụ lưu trữ chọn các khóa. Nối tiếp sẽ không luôn dẫn đến khóa phạm vi - công cụ lưu trữ có thể chọn bất kỳ loại khóa nào vẫn tôn vinh mức cô lập.


5

Nếu có một chỉ mục trên một vị từ tìm kiếm, nó có thể được sử dụng cho các khóa phạm vi .

Tức là, khóa từ hàng đầu tiên đến tiếp theo trong phạm vi. Và từ đó bên cạnh hàng thứ ba, vv Lên đến hàng cuối cùng trong phạm vi. Vì vậy, về cơ bản là một số khóa hàng, nhưng nó chặn phạm vi từ các phần chèn cũng cho các giá trị "ở giữa" (khóa phạm vi).

Để điều này xảy ra, bạn (SQL Server) cần phải có một chỉ mục để làm việc. Không có chỉ mục để thực hiện khóa (chỉ mục trên các vị từ), bạn sẽ (từ những gì tôi biết) sẽ nhận được khóa 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.