Aracılığıyla paylaş


İ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.

Ç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:

Ayrıca bkz.