Chúc mừng bạn đã nhận được SqlDependency
đang làm việc (Tôi không mỉa mai chút nào, nhiều người đã thất bại trong việc này).
Bây giờ là lúc để đọc Tạo Truy vấn Thông báo chủ đề trên MSDN. Bạn sẽ thấy các điều kiện theo đó các truy vấn hợp lệ cho các thông báo, bao gồm cả yêu cầu sau:
Tôi đã viết về những điều cơ bản về cách làm SqlDependency
hoạt động
, có thể sẽ làm sáng tỏ một số hiểu lầm. Và, là một nút phụ, vì bạn đang sử dụng Linq, bạn có thể quan tâm đến LinqToCache , cung cấp cầu nối giữa Linq
truy vấn và SqlDependency
.
Một nhận xét khác:không Start()
và Stop()
SqlDependency
của bạn nilly-willy. Bạn sẽ hối hận sớm thôi. Start()
phải được gọi chính xác một lần, trong khi khởi động ứng dụng và Stop()
chính xác một lần trong quá trình tắt ứng dụng (nói đúng ra là trong quá trình tải và dỡ tên miền ứng dụng).
Bây giờ, về vấn đề của bạn:mức độ cách ly quan trọng là một trong truy vấn được thông báo . Điều đó có nghĩa là, truy vấn mà bạn đính kèm đăng ký, không phải truy vấn mà bạn thực hiện UPDATE
(Tôi sẽ không bình luận về sự khôn ngoan của việc CẬP NHẬT dưới các lần đọc bẩn ... hoặc sự khôn ngoan của việc sử dụng đọc bẩn cho bất cứ điều gì
). Theo như tôi có thể nói, mã bạn hiển thị không nên đăng truy vấn dưới read_uncomiled. Sau khi bạn phát hành SET TRANSACTION ISOLATION ...
tất cả các giao dịch tiếp theo (ergo tất cả các bản sao kê) trong phiên đó sẽ ở dưới mức cô lập đó. Bạn đóng kết nối (thông qua việc loại bỏ DataContext) và sau đó sử dụng một kết nối khác. Trừ khi ... bạn sử dụng nhóm kết nối. Chào mừng đến với câu lạc bộ của những nạn nhân vô tội :). Thay đổi mức độ cô lập của tổng hợp rò rỉ kết nối qua Close()
/ Open()
ranh giới
. Và đó là vấn đề của bạn. Có một số giải pháp dễ dàng:
- Bạn có thể (phải!) đặt lại mức cô lập một cách rõ ràng sau khi
Open()
- Bạn có thể sử dụng phạm vi System.Transactions (đề xuất của tôi). Đọc bắt buộc: sử dụng TransactionScope mới () Được coi là Có hại
- Không sử dụng gộp kết nối.
Và trong khi chúng ta đang nói chuyện, bạn cũng cần đọc phần này: Sử dụng bảng làm hàng đợi .