2009-11-09 42 views
110

Trong khi thay đổi một bảng (loại bỏ một cột) trong SQL Server 2008, tôi nhấp vào nút Tạo Thay đổi Script và tôi nhận thấy rằng tập lệnh thay đổi được tạo ra sẽ giảm cột, nói "đi" và sau đó chạy câu lệnh ALTER TABLE bổ sung xuất hiện để đặt độ leo khóa cho bảng thành "TABLE". Ví dụ:Khóa treo - Điều gì đang xảy ra ở đây?

ALTER TABLE dbo.Contract SET (LOCK_ESCALATION = TABLE) 

Tôi cũng nên lưu ý rằng đây là điều cuối cùng mà tập lệnh thay đổi đang thực hiện. Nó làm gì ở đây và tại sao nó đặt LOCK_ESCALATION thành TABLE?

Trả lời

141

"Lock Escalation" là cách SQL xử lý khóa cho các bản cập nhật lớn. Khi SQL sắp thay đổi nhiều hàng, công cụ cơ sở dữ liệu sẽ mất ít hơn, khóa lớn hơn (ví dụ: toàn bộ bảng) thay vì khóa nhiều thứ nhỏ hơn (ví dụ: khóa hàng).

Nhưng điều này có thể có vấn đề khi bạn có một bảng lớn, bởi vì lấy một khóa trên toàn bộ bảng có thể khóa các truy vấn khác trong một thời gian dài. Đó là sự cân bằng: nhiều khóa nhỏ chi tiết chậm hơn ít hơn (hoặc một) khóa thô, và có nhiều truy vấn khóa các phần khác nhau của bảng tạo ra khả năng bế tắc nếu một tiến trình đang chờ đợi.

Có tùy chọn cấp bảng, LOCK_ESCALATION, mới trong SQL 2008, cho phép kiểm soát khóa leo thang. Mặc định, "TABLE" cho phép khóa leo thang tất cả các cách đến mức bảng. DISABLE ngăn khóa leo thang lên toàn bộ bảng trong hầu hết các trường hợp. AUTO cho phép khóa bảng ngoại trừ nếu bảng được phân vùng, trong trường hợp khóa chỉ được tạo lên đến mức phân vùng. Xem this blog post để biết thêm thông tin. Tôi nghi ngờ rằng IDE thêm cài đặt này khi tạo lại bảng vì TABLE là mặc định trong SQL 2008. Lưu ý rằng LOCK_ESCALATION không được hỗ trợ trong SQL 2005, vì vậy bạn sẽ cần phải loại bỏ nó nếu cố gắng chạy tập lệnh trên phiên bản 2005. Ngoài ra, vì TABLE là mặc định, bạn có thể xóa một cách an toàn dòng đó khi chạy lại tập lệnh của mình.

Cũng lưu ý rằng, trong SQL 2005 trước khi thiết lập này đã có mặt, tất cả các ổ khóa có thể leo thang để bàn level-- nói cách khác, "TABLE" là bối cảnh chỉ trên SQL 2005.

+1

Bài đăng trùng lặp trên Diễn đàn MSDN: http://social.msdn.microsoft.com/Forums/en-US/sqldatabaseengine/thread/e96aa19e-d72c-46af-b2e8-4bf54de09440 –

+0

@JustinGrant: Biểu thức này có thể được kết hợp với câu lệnh 'CREATE TABLE'? –

+6

@dma_k - Tùy chọn này không liên quan đến 'TẠO TẠO' vì bảng không tồn tại nên không có gì để khóa. –

6

Bạn có thể kiểm tra xem bạn cần phải bao gồm báo cáo kết quả LOCK_ESCALATION trong kịch bản của bạn bằng cách so sánh giá trị này trước và sau khi chạy phần chính của kịch bản của bạn:

SELECT lock_escalation_desc FROM sys.tables WHERE name='yourtablename' 

trong trường hợp của tôi, thay đổi bảng để thả hoặc thêm một hạn chế dường như không thay đổi này giá trị.

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