2013-01-07 28 views
5

Tôi đã đặt khóa cách ly giao dịch có thể tuần tự hóa cho một giao dịch. Nhưng tôi đang quan sát một số kết quả không được mong đợi.khóa cách ly giao dịch tuần tự

truy vấn của tôi là

update tabl1 set col2 = 10 where col1 > 10 and col1 < 20 

Đây col1 là hàng key.Here chính với col1 có giá trị 10,11,12 .... 19,20 được khóa để cập nhật/chèn. Trong điều kiện tôi có các điều kiện như col1> 10 và col1 < 20 nhưng vẫn có các hàng có col1 = 10 và col1 = 20 bị khóa.

Nếu tôi cung cấp cho

update tabl1 set col2 = 10 where col1 => 10 and col1 <= 20 

sau đó hàng với col2 có giá trị 9-21 được locked.So tại sao col1 có 9 và 21 sẽ bị khóa ở đây?

Đối với bảng dưới đây, bảng đầy đủ bị khóa. Col3 là cột không chính. Tôi không thể đặt khóa nếu cột ở nơi điều kiện không phải là khóa chính?

update tabl1 set col2 = 10 where col3 > 10 and col3 < 20 

Trả lời

4

Đối với khóa phạm vi khóa SQL Server phải sử dụng một chỉ số để đáp ứng các điều kiện phạm vi rất liên quan đến truy vấn cuối cùng của bạn, bạn sẽ cần một chỉ mục trên col3 (và có thể truy vấn gợi ý để buộc việc sử dụng nó nếu kế hoạch không sử dụng nó)

Ngoài ra, nó không chỉ khóa phạm vi cụ thể trong mệnh đề WHERE của bạn. Nó khóa phím. Một khóa phạm vi trên một khóa bảo vệ phạm vi từ khóa đó xuống tới khóa tiếp theo để phạm vi chính xác sẽ bị chặn phụ thuộc vào những khóa nào tồn tại trong chỉ mục.

Chi tiết/liên kết khác là in my answer here

+0

Nhưng chỉ mục nào nên được sử dụng? – wincoding

+0

@wincoding - Nó không tạo ra sự khác biệt nào SQL Server có thể lấy khóa ở phạm vi khóa hoặc miễn là nó sử dụng chỉ mục đó để giải quyết 'WHERE' –

Các vấn đề liên quan