SQL Server - mức cô lập nào cho các câu lệnh chọn không chặn?


9

Tôi có một giao dịch chạy dài (được gọi là, giả sử, T1) thực hiện một số thao tác xóa, cập nhật và chèn trên một bảng trong SQL Server 2008 R2. Đồng thời, một quy trình khác định kỳ chạy các câu lệnh chọn từ bảng này.

Trong cài đặt cách ly mặc định (Tôi đã đọc CAM KẾT?), T1 chặn mọi câu lệnh được chọn chạy cho đến khi giao dịch được thực hiện hoặc được khôi phục.

Những gì tôi muốn thấy là cho các câu lệnh được chọn hoạt động trên dữ liệu nhất quán ngay cả khi giao dịch đang được tiến hành. Tôi tin rằng sự cô lập SNAPSHOT có thể giúp ích, nhưng tôi không chắc liệu mình có đi đúng hướng hay không. Đây sẽ là mức cô lập tốt nhất cho ứng dụng này?

Thứ hai, tôi không có bất kỳ quyền kiểm soát nào đối với quá trình gọi các câu lệnh chọn, nhưng tôi có quyền kiểm soát ứng dụng .NET gọi T1. Bất kỳ thay đổi mức cô lập nào sẽ được yêu cầu trên cả hai câu lệnh chọn và T1, hoặc liệu có đủ để đánh dấu chỉ T1 là có mức cách ly khác nhau không?

Câu trả lời:


8

Trong một thế giới lý tưởng, bạn sẽ có hai sự lựa chọn, SNAPSHOT và ĐỌC SNAPSHOT (RCSI). Hãy chắc chắn rằng bạn hiểu những điều cơ bản về mức độ cô lập giao dịch trước khi bạn quyết định mức nào phù hợp với khối lượng công việc của bạn. Cụ thể hãy lưu ý đến các kết quả khác nhau mà bạn có thể thấy là kết quả của việc chuyển sang RCSI.

Điều này có vẻ như đó không phải là một thế giới lý tưởng vì bạn không có bất kỳ quyền kiểm soát nào đối với ứng dụng đang tạo ra các câu lệnh chọn. Trong trường hợp đó, tùy chọn duy nhất của bạn là kích hoạt RCSI cho cơ sở dữ liệu được đề cập sao cho những người được chọn sẽ tự động sử dụng RCSI thay vì ĐỌC CAM KẾT.


6

Chính xác, sử dụng cách ly SNAPSHOT để có được dữ liệu nhất quán, được cam kết từ trước khi giao dịch bắt đầu.

Cách ly READ UNCOMMITTED (còn gọi là gợi ý NOLOCK) sẽ đọc dữ liệu không phù hợp, dữ liệu không nhất quán

Khi bạn bật cách ly SNAPSHOT, thì nó sẽ có hiệu lực cho tất cả các CHỌN đi về phía trước. Bạn chạy ALTER DATABASEvới READ_COMMITTED_SNAPSHOT trong trường hợp này

Chỉnh sửa: thêm liên kết + trích dẫn của ALTER DATABASE (đậm của tôi)

Cho phép tùy chọn Ảnh chụp đã đọc ở cấp cơ sở dữ liệu. Khi được bật, các câu lệnh DML bắt đầu tạo các phiên bản hàng ngay cả khi không có giao dịch nào sử dụng Cách ly ảnh chụp. Khi tùy chọn này được bật, các giao dịch chỉ định mức cô lập đã đọc cam kết sử dụng phiên bản hàng thay vì khóa. Khi một giao dịch chạy ở mức cô lập đã cam kết đã đọc, tất cả các câu lệnh sẽ thấy một ảnh chụp nhanh dữ liệu khi nó tồn tại ở đầu câu lệnh.

Và từ việc sử dụng Snapshot Isolation (đậm của tôi)

Tùy chọn cơ sở dữ liệu READ_COMMITTED_SNAPSHOT xác định hành vi của mức cô lập READ CAMITTED mặc định khi cách ly ảnh chụp nhanh được bật trong cơ sở dữ liệu. Nếu bạn không chỉ định rõ ràng READ_COMMITTED_SNAPSHOT ON, READ CAMITTED được áp dụng cho tất cả các giao dịch ngầm. Điều này tạo ra hành vi tương tự như cài đặt READ_COMMITTED_SNAPSHOT TẮT (mặc định). Khi READ_COMMITTED_SNAPSHOT OFF có hiệu lực, Công cụ cơ sở dữ liệu sử dụng các khóa được chia sẻ để thực thi mức cô lập mặc định. Nếu bạn đặt tùy chọn cơ sở dữ liệu READ_COMMITTED_SNAPSHOT thành BẬT, công cụ cơ sở dữ liệu sẽ sử dụng phiên bản hàng và cách ly ảnh chụp làm mặc định, thay vì sử dụng khóa để bảo vệ dữ liệu.

Vì vậy, vâng.

Kích hoạt RCSI sẽ cho phép đọc để có được dữ liệu nhất quán và không bị chặn bởi các nhà văn sẽ tiếp tục sử dụng Đọc cam kết


4

Tôi muốn đề nghị bạn đọc câu hỏi sau đây và câu trả lời của nó: Vấn đề khóa cơ sở dữ liệu? .

Tìm mức cô lập phù hợp để sử dụng ở mức db là cách nhanh nhất mà bạn có thể làm ngay bây giờ để giúp bạn khắc phục vấn đề này, vì hiện tại rất khó để thay đổi tất cả các ứng dụng chạm vào cơ sở dữ liệu và thay đổi mã của chúng. Vì bạn đã nói "Tôi không có bất kỳ quyền kiểm soát nào đối với quy trình đang gọi các câu lệnh được chọn", câu trả lời nhanh nhất sẽ là chuyển db sang mức cách ly Ảnh chụp đã đọc được cam kết, do đó bạn sẽ không chạm vào các truy vấn đọc. Nếu không, bạn cần sử dụng mức cô lập Ảnh chụp nhanh cho các phiên đọc dữ liệu trong các giao dịch lớn của mình.

Thêm chi tiết ở đây về việc chọn đúng: Chọn Cấp độ cách ly dựa trên phiên bản hà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.