İyimser Eşzamanlılık: Genel Bakış
LINQ to SQL iyimser eşzamanlılık denetimini destekler. Aşağıdaki tabloda LINQ to SQL belgelerinde iyimser eşzamanlılık için geçerli olan terimler açıklanmaktadır:
Terimler | Açıklama |
---|---|
eşzamanlılık | Aynı anda iki veya daha fazla kullanıcının aynı veritabanı satırını güncelleştirmeye çalıştığı durum. |
eşzamanlılık çakışması | Aynı anda iki veya daha fazla kullanıcının bir satırın bir veya daha fazla sütununa çakışan değerler göndermeye çalıştığı durum. |
eşzamanlılık denetimi | Eşzamanlılık çakışmalarını çözmek için kullanılan teknik. |
iyimser eşzamanlılık denetimi | Değişikliklerin gönderilmesine izin vermeden önce diğer işlemlerin bir satırdaki değerleri değiştirip değiştirmediğini ilk araştıran teknik. Eşzamanlılık çakışmalarını önlemek için kaydı kilitleyen kötümser eşzamanlılık denetimiyle karşıtlık. İyimser denetim, bir işlemin başka bir işlemi engelleme olasılığının düşük olma olasılığını göz önünde bulundurarak bu şekilde ifade edilir. |
çakışma çözümü | Veritabanını yeniden sorgulayıp farklılıkları uzlaştırarak çakışan bir öğeyi yenileme işlemi. Bir nesne yenilendiğinde, LINQ to SQL değişiklik izleyicisi aşağıdaki verileri içerir: - Başlangıçta veritabanından alınan ve güncelleştirme denetimi için kullanılan değerler. - Sonraki sorgudaki yeni veritabanı değerleri. LINQ to SQL daha sonra nesnenin çakışıp çakışmadığını (yani bir veya daha fazla üye değerinin değişip değişmediğini) belirler. Nesne çakışıyorsa, LINQ to SQL bundan sonra hangi üyelerinin çakışmada olduğunu belirler. LINQ to SQL'in keşfettiği tüm üye çakışmaları bir çakışma listesine eklenir. |
LINQ to SQL nesne modelinde, aşağıdaki koşulların her ikisi de doğru olduğunda iyimser bir eşzamanlılık çakışması oluşur:
İstemci, değişiklikleri veritabanına göndermeye çalışır.
İstemcinin son okuma tarihinden bu yana veritabanında bir veya daha fazla güncelleştirme denetimi değeri güncelleştirildi.
Bu çakışmanın çözümü, nesnenin hangi üyelerinin çakışmada olduğunu bulmayı ve ardından bu konuda ne yapmak istediğinize karar vermenizi içerir.
Not
Yalnızca iyimser eşzamanlılık denetimleriyle Always eşlenen veya WhenChanged bu denetimlere katılan üyeler. olarak işaretlenen Neverüyeler için bir denetim yapılmaz. Daha fazla bilgi için bkz. UpdateCheck.
Örnek
Örneğin, aşağıdaki senaryoda, Kullanıcı1 veritabanını bir satır için sorgulayarak bir güncelleştirme hazırlamaya başlar. User1, Alfreds, Maria ve Sales değerlerini içeren bir satır alır.
User1, Yönetici sütununun değerini Alfred ve Department sütununun değerini Pazarlama olarak değiştirmek istiyor. User1 bu değişiklikleri göndermeden önce, User2 veritabanına değişiklikler gönderdi. Bu nedenle artık Yardımcı sütununun değeri Mary, Department sütununun değeri ise Service olarak değiştirildi.
User1 artık değişiklikleri göndermeye çalıştığında gönderim başarısız olur ve bir ChangeConflictException özel durum oluşturulur. Bu sonuç, Yardımcı sütunu ve Departman sütunu için veritabanı değerleri beklenen değerler olmadığından oluşur. Yardımcı ve Departman sütunlarını temsil eden üyeler çakışıyor. Aşağıdaki tabloda durum özetlemektedir.
Durum | Yönetici | Yardımcı | Bölüm |
---|---|---|---|
Özgün durum | Alfreds | Maria | Sales |
Kullanıcı1 | Alfred | Pazarlama | |
Kullanıcı2 | Mary | Hizmet |
Bunun gibi çakışmaları farklı yollarla çözebilirsiniz. Daha fazla bilgi için bkz . Nasıl yapılır: Değişiklik Çakışmalarını Yönetme.
Çakışma Algılama ve Çözümleme Denetim Listesi
Çakışmaları herhangi bir ayrıntı düzeyinde algılayabilir ve çözebilirsiniz. Aşırı uç noktalardan birinde, tüm çakışmaları üç yoldan biriyle çözebilirsiniz (bkz RefreshMode. ) ek dikkate almadan. Diğer uç noktada, çakışma içindeki her üye üzerinde her çakışma türü için belirli bir eylem belirleyebilirsiniz.
Nesne modelinizdeki seçenekleri belirtin veya düzeltin UpdateCheck .
Daha fazla bilgi için bkz . Nasıl yapılır: Eşzamanlılık Çakışmaları için Test Edilen Üyeleri Belirtme.
çağrısının SubmitChangestry/catch bloğunda, özel durumların hangi noktada oluşturulacağını belirtin.
Daha fazla bilgi için bkz . Nasıl yapılır: Eşzamanlılık Özel Durumlarının Ne Zaman Oluştuğunı Belirtme.
Ne kadar çakışma ayrıntısı almak istediğinizi belirleyin ve buna göre try/catch bloğunuza kod ekleyin.
Daha fazla bilgi için bkz . Nasıl yapılır: Varlık Çakışma Bilgilerini Alma ve Nasıl Yapılır: Üye Çakışma Bilgilerini Alma.
Kodunuzda
try
/catch
bulduğunuz çeşitli çakışmaları nasıl çözümlemek istediğinizi ekleyin.Daha fazla bilgi için bkz . How to: Resolve Conflicts by Retaining Database Values, How to: Resolve Conflicts by Overwriting Database Values and How to: Resolve Conflicts by Birleştirme with Database Values.
Çakışma Bulma ve Çözümlemeyi Destekleyen LINQ to SQL Türleri
LINQ to SQL'de iyimser eşzamanlılıktaki çakışmaların çözümünü destekleyen sınıflar ve özellikler aşağıdakileri içerir: