Selamat mendapatkan SqlDependency
bekerja (saya sama sekali tidak menyindir, banyak yang gagal dalam hal ini).
Sekarang saatnya membaca Membuat Kueri untuk Pemberitahuan topik di MSDN. Anda akan melihat kondisi di mana kueri valid untuk notifikasi, termasuk persyaratan ini:
Saya menulis tentang dasar-dasar cara SqlDependency
bekerja
, mungkin akan menjernihkan beberapa kesalahpahaman. Dan, sebagai simpul samping, karena Anda menggunakan Linq, Anda mungkin tertarik dengan LinqToCache , yang menyediakan jembatan antara Linq
kueri dan SqlDependency
.
Komentar lain:jangan Start()
dan Stop()
SqlDependency
. Anda mau tak mau. Anda akan segera menyesalinya. Start()
seharusnya dipanggil tepat sekali, selama startup aplikasi, dan Stop()
tepat sekali selama penonaktifan aplikasi (tepatnya, adalah selama pemuatan dan pembongkaran domain aplikasi).
Sekarang, tentang masalah Anda:tingkat isolasi yang penting adalah salah satu dari kueri yang diberi tahu . Artinya, kueri yang Anda lampirkan langganan, bukan kueri tempat Anda melakukan UPDATE
(Saya tidak akan mengomentari kebijaksanaan melakukan UPDATE di bawah pembacaan kotor ... atau kebijaksanaan menggunakan pembacaan kotor untuk apa pun
). Sejauh yang saya tahu, kode yang Anda tampilkan tidak boleh memposting kueri di bawah read_uncommitted. Setelah Anda mengeluarkan SET TRANSACTION ISOLATION ...
semua transaksi berikutnya (ergo semua pernyataan) di sesi itu akan berada di bawah tingkat isolasi itu. Anda menutup koneksi (melalui pembuangan DataContext) dan kemudian menggunakan koneksi yang berbeda. Kecuali ... Anda menggunakan kumpulan koneksi. Selamat datang di klub korban tak berdosa :). Kebocoran penyatuan koneksi mengubah tingkat isolasi di seluruh Close()
/Open()
batas
. Dan itu adalah masalah Anda. Ada beberapa solusi mudah:
- Anda dapat (harus!) menyetel ulang tingkat isolasi secara eksplisit setelah
Open()
- Anda dapat menggunakan cakupan System.Transactions (rekomendasi saya). Bacaan wajib: menggunakan TransactionScope() baru Dianggap Berbahaya
- Jangan gunakan penyatuan koneksi.
Dan sementara kita berbicara, Anda perlu membaca ini juga: Menggunakan Tabel sebagai Antrian .