2012-01-09 34 views
5

Tôi đang làm việc trên một ứng dụng đa luồng (C#), và 2 luồng đang cập nhật một bảng sử dụng NOLOCK cùng một lúc, đó có phải là một vấn đề không? Để cụ thể hơn, cả hai đều cập nhật cùng một bản ghi.NOLOCK với Đa luồng

+3

Biết khi nào cần sử dụng NOLOCK yêu cầu hiểu biết sâu sắc về cách thức, thời điểm và lý do tại sao SQL Server khóa thứ gì. Nó không nên được sử dụng ngẫu nhiên. Nếu bạn phải hỏi câu hỏi này, có lẽ bạn không nên sử dụng NOLOCK chút nào. –

+1

NOLOCK là bỏ qua khóa được giữ bởi người viết khi bạn chỉ muốn đọc dơ bẩn! –

+0

Nếu tôi biết về nolock tôi sẽ không hỏi :) Đây là cách ứng dụng được thực hiện tại công việc của tôi và tôi đang gỡ lỗi vấn đề. Họ sử dụng nolock trong mọi truy vấn bất kể. Chúng tôi có gần 800 procs được lưu trữ. – fbhdev

Trả lời

4

Câu trả lời là "phụ thuộc".

NOLOCK cho phép 'đọc bẩn'. Điều này có nghĩa là trong giao dịch, bạn có thể thấy dữ liệu không được cam kết từ một giao dịch khác. Nếu bạn có nhiều chủ đề cập nhật cùng một hàng trong cùng một bảng, bạn có thể thấy giá trị đã sửa đổi của dữ liệu mà chủ đề khác đã chạm vào, trước khi luồng đó thực hiện giao dịch của nó.

Ví dụ: lấy bảng account_balances, được định nghĩa là (int account_num, số thập phân số dư (12,2)). Giả sử sau đây xảy ra:

// điều kiện tiên quyết, chiếm # 1 có một sự cân bằng của 10,00

  1. Chủ đề # 1 bắt đầu một giao dịch, chiếm suất này # 1 10
  2. Chủ đề # 2 bắt đầu một giao dịch , cố gắng đọc số dư tài khoản số 1. Nó đọc một sự cân bằng của 0.
  3. Chủ đề # 2 decrements tài khoản bằng $ 5, và phát hành một thấu chi cho khách hàng (cân đối của họ là -5)
  4. Chủ đề # 1 cuộn sao nó giao dịch
  5. Chủ đề # 2 cam kết đó là giao dịch

// số dư tài khoản tại là -5, mặc dù nó nên 5.

gì bạn sẽ không thấy là một số hình thức dữ liệu không nhất quán trong một field- gợi ý nolock không giống như chạy mã đa luồng withou t một khóa-cá nhân viết vẫn còn nguyên tử.

+1

Ngay cả dưới 'đọc uncommitted', nhà văn khối nhà văn. Do đó, chuỗi 2 sẽ không thể cập nhật hàng cho đến khi giao dịch của luồng 1 hoàn tất. Khác hơn thế, đây là điểm trên. – zinglon

+0

Cố định, cảm ơn cho việc bắt –

+0

Vì vậy, nếu tôi đang mong đợi một 1 trong cột và nó hiển thị như 2, nó có thể là chủ đề đua hơn là có bất cứ điều gì để làm với nolock? – fbhdev

2

Điều đó có nghĩa là bạn có thể nhận hồ sơ ở trạng thái 'sai'.

Ví dụ ...

  • Process1 được xóa một khối dữ liệu
  • Process2 đang đọc một khối chồng chéo dữ liệu, VỚI NOLOCK

Trong một tình huống lý tưởng, hoặc là tất cả các các bản ghi bị xóa bởi Process1 hoặc là hiện tại hoặc bị xóa. Bởi vì Process2 đang sử dụng NOLOCK, nó có thể đọc một số của các bản ghi Process1 đang xóa, nhưng không phải vì các bản ghi khác vì chúng đã biến mất.

Điều tương tự cũng xảy ra đối với INSERTS và UPDATES. Bạn có thể chỉ cần đọc các bản ghi mà chỉ là một phần của con đường thông qua bị thay đổi theo một cách nào đó.


Cho dù đây là một vấn đề phụ thuộc vào dữ liệu của bạn, thiết kế của bạn, vv

Một công cụ tìm kiếm sẽ không quan tâm nếu điều này xảy ra. Một ngân hàng xử lý các giao dịch tài chính sẽ.

0

Bạn không thể thay đổi cùng một bản ghi cùng lúc, ngay cả khi sử dụng gợi ý NOLOCK.

NHƯNG

Bạn có thể đưa dữ liệu vào trạng thái không phù hợp.

AFAIK - không thể áp dụng gợi ý này để nhắm mục tiêu bảng cập nhật.

Và - gợi ý này cho phép bạn đọc dữ liệu không bị giam, không ghi đè lên họ.

0

Hãy cẩn thận cách bạn sử dụng tính năng này. Dữ liệu không nhất quán tiềm năng.

Nếu một truy vấn là thiết Cola = "newColANewvalue" từ tableA với (nolock), nơi Cola = "colAOldvalue"

Và truy vấn khác là bộ colC = "colCnewValue" từ tableA với (nolock), nơi Cola = "colAOldvalue"

Bạn có thể kết thúc bằng colC = "colCnewValue" và colA = "newColANewvalue" trên cùng một bản ghi. Nếu đó không phải là một vấn đề thì OK.

Điều gì đang thúc đẩy điều này? Bạn có gặp phải sự cố về hiệu suất với khóa liên tiếp hoặc khóa trang không?