ĐỌC VỚI (NOLOCK) so với SET GIAO DỊCH CẤP ĐỘ ISOLATION ĐỌC KHÔNG ĐƯỢC ĐỀ XUẤT


118

Ai đó có thể cho tôi một số hướng dẫn về thời điểm tôi nên sử dụng thay WITH (NOLOCK)SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Ưu / nhược điểm của từng loại là gì? Có bất kỳ hậu quả không mong muốn nào bạn gặp phải khi sử dụng cái này thay vì cái kia không?

Câu trả lời:


105

Họ là những điều tương tự. Nếu bạn sử dụng set transaction isolation levelcâu lệnh, nó sẽ áp dụng cho tất cả các bảng trong kết nối, vì vậy nếu bạn chỉ muốn một nolocktrên một hoặc hai bảng, hãy sử dụng câu lệnh đó; nếu không thì sử dụng cái khác.

Cả hai sẽ cung cấp cho bạn đọc bẩn. Nếu bạn ổn với điều đó, thì hãy sử dụng chúng. Nếu bạn không thể có những bài đọc bẩn, thì hãy xem xét snapshothoặc serializablegợi ý.


Hãy xem xét REPEATABLE READthay vì SERIALIZABLEnếu bạn không quan tâm đến dữ liệu ảo. SERIALIZABLETHỰC SỰ hạn chế và hầu như không bao giờ được sử dụng (ngoại trừ ví dụ: trong một số ứng dụng tài chính quan trọng).
Kryptos


10
  • NOLOCK là cục bộ của bảng (hoặc các chế độ xem, v.v.)
  • READ UNCOMMITTED là mỗi phiên / kết nối

Về hướng dẫn ... một tìm kiếm ngẫu nhiên từ StackOverflow và interweb điện ...


Liên kết cuối cùng "Tại sao sử dụng NOLOCK là không tốt .." không còn tồn tại.
sangam

1
interweb điện là vô giá. cảm ơn vì đã thêm chút nắng cho ngày của tôi.
JJS

9

Theo hiểu biết của tôi, sự khác biệt duy nhất là phạm vi của các hiệu ứng như Strommy đã nói. NOLOCK gợi ý trên một bảng và ĐỌC KHÔNG ĐƯỢC ĐỀ XUẤT trong phiên.

Đối với các vấn đề có thể xảy ra, đó là tất cả về tính nhất quán. Nếu bạn quan tâm thì hãy lưu ý rằng bạn có thể nhận được những gì được gọi là đọc bẩn có thể ảnh hưởng đến dữ liệu khác bị thao túng trên thông tin không chính xác.

Cá nhân tôi không nghĩ rằng tôi đã gặp bất kỳ vấn đề nào từ điều này nhưng điều đó có thể nhiều hơn do cách tôi sử dụng nolock. Bạn cần lưu ý rằng có những trường hợp sử dụng được. Các tình huống trong đó bạn chủ yếu thêm dữ liệu mới vào bảng nhưng có một quy trình khác đi kèm để kiểm tra kịch bản dữ liệu. Điều đó có thể sẽ ổn vì quy trình chính không bao gồm việc quay lại và cập nhật các hàng trong quá trình đọc.

Ngoài ra, tôi tin rằng những ngày này bạn nên xem xét Kiểm soát đồng thời nhiều phiên bản. Tôi tin rằng họ đã thêm nó vào năm 2005 và nó giúp ngăn người viết chặn người đọc bằng cách cho người đọc xem nhanh cơ sở dữ liệu để sử dụng. Tôi sẽ bao gồm một liên kết và để lại nghiên cứu sâu hơn cho người đọc:

MVCC

Mức độ cô lập cơ sở dữ liệu


+1 Mặc dù tôi không hiểu về khía cạnh "nên bạn" của READ_UNCOMMITTED ", Sean đề cập đến vấn đề này một cách tuyệt vời. Cũng có trường hợp bạn có thể đọc cùng một hàng hai lần trong SQL Server (do tách trang).
Anon246

6

Bạn không thể sử dụng Đặt mức cô lập giao dịch Đọc không được gửi trong Chế độ xem (trên thực tế bạn chỉ có thể có một tập lệnh trong đó), vì vậy bạn sẽ phải sử dụng (nolock) nếu các hàng bẩn nên được bao gồm.


4

Vì bạn phải sử dụng WITH (NOLOCK) cho mỗi bảng, có thể khó chịu khi viết nó trong mỗi mệnh đề FROM hoặc JOIN. Tuy nhiên nó có lý do tại sao nó được gọi là đọc "bẩn". Vì vậy, bạn thực sự nên biết khi nào bạn thực hiện một thao tác và không đặt nó làm mặc định cho phạm vi phiên. Tại sao?

Quên WITH (NOLOCK) có thể không ảnh hưởng đến chương trình của bạn một cách quá nghiêm trọng, tuy nhiên, việc đọc bẩn nơi bạn không muốn có thể tạo ra sự khác biệt trong một số trường hợp nhất định.

Vì vậy, hãy sử dụng WITH (NOLOCK) nếu dữ liệu hiện tại đã chọn được phép không chính xác, vì nó có thể được khôi phục lại sau này. Điều này chủ yếu được sử dụng khi bạn muốn tăng hiệu suất và các yêu cầu về ngữ cảnh ứng dụng của bạn cho phép nó có nguy cơ hiển thị dữ liệu không nhất quán. Tuy nhiên, bạn hoặc người chịu trách nhiệm phải cân nhắc ưu và nhược điểm của quyết định sử dụng WITH (NOLOCK).

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.