Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 42676|Yanıt: 4

[Kaynak] Eşzamanlı Zaman Damgası ve Eşdeğer Kontrol ayrımının ele alınması

[Bağlantıyı kopyala]
Yayınlandı 8.04.2017 00:10:50 | | | |


Yazarwww.itsvse.com @小渣渣 !
Temel verileri başarıyla ekle!
ConcurrencyCheck özelliğinin test edilmesi tamamlandı
Güncelleme başarılı! Not 1
Güncelleme olağanüstü! Not 2, anormal bilgi! Store update, insert, or delete ifadesi beklenmedik sayıda satır (0) etkiliydi. Varlıklar yüklendikten sonra değiştirilmiş veya silinmiş olabilir. İyimser eşzamanlı istisnaların anlaşılması ve başa çıkılması hakkında bilgi için http://go.microsoft.com/fwlink/?LinkId=472540'a bakınız.

Zaman Damgası ile Eşdeğer Kontrolü arasındaki farkı test edin
GüncellemeTab1 güncellemesi başarılı! İsim 1
GüncellemeTab2 güncellemesi başarılı! İsim 1
GüncellemeTab2 güncellemesi anormal bir durum! 2 söyle, anormal bilgi! Store update, insert, or delete ifadesi beklenmedik sayıda satır (0) etkiliydi. Varlıklar yüklendikten sonra değiştirilmiş veya silinmiş olabilir. İyimser eşzamanlı istisnaların anlaşılması ve başa çıkılması hakkında bilgi için http://go.microsoft.com/fwlink/?LinkId=472540'a bakınız.
GüncellemeTab1 güncellemesi başarılı! İsim 2

【TimeStamp】
TimeStamp özelliği, yalnızca bir bayt dizi özelliğine sahip alan sınıfına uygulanabilir ve bu özellik tiemStamp tipini sütuna ayarlar. Eşzamanlı kontrollerde, Code-First otomatik olarak bu TimeStamp türü alanını kullanır.

【Eşdeğer Kontrol】
ConcurrencyCheck özelliği, bir alan sınıfının özelliklerine uygulanabilir. EF güncelleme işlemi gerçekleştirdiğinde, Code-First sütunun değerini where koşul ifadesine koyar ve bu CurrencyCheck özelliğini kullanarak mevcut sütunları eşzamanlılık kontrolü için kullanabilirsiniz; ayrı bir TimeStamp sütunu yerine eşzamanlılık kontrolü için kullanılabilir.

Eşdeğer işlemede Zaman Damgası ile Eşdeğerlilik Kontrolü arasındaki farkı göstermek için yeni bir bağlam nesnesi oluşturarak başlayalım!

İşte bağlam için kodu:




Veritabanının sütunlarına şu şekilde bakalım:



Tab1 ve tab2'nin Id, Name ve Respot sütunlarına sahip olduğunu, sekme 2'nin ise tab1'den daha fazla RowVersion sütununa sahip olduğunu göreceğiz.

Önce test kodunu ekleyin:



【Eşdeğer Kontrol İlkesi】



Tab1'in Not özelliğine ConcurrencyCheck özelliğini ekledik,


Aynı verinin Adı öznitelik değerini aynı anda güncelledikde hiçbir istisna olmaz!


SQL ifadeleri oluşturun:


exec sp_executesql N'UPDATE [dbo]. [Tab1]
SET [İsim] = @0
BURADA (([id] = @1) VE ([Yorum] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'name1',@1=1,@2=N'Note1'
exec sp_executesql N'UPDATE [dbo]. [Tab1]
SET [İsim] = @0
BURADA (([id] = @1) VE ([Yorum] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'name2',@1=1,@2=N'note1'

Aynı verinin Remark özellik değerini aynı anda güncellirsek, bir istisna atıyoruz!

SQL ifadeleri oluşturun:

exec sp_executesql N'UPDATE [dbo]. [Tab1]
SET [Yorum] = @0
BURADA (([id] = @1) VE ([Yorum] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'Note1',@1=1,@2=N'Note'
exec sp_executesql N'UPDATE [dbo]. [Tab1]
SET [Yorum] = @0
BURADA (([id] = @1) VE ([Yorum] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'Note 2',@1=1,@2=N'Note'

Aynı veri parçasını Id 1 ile aynı anda alırsak, Remark özniteliğinin değerini alacağımızı ve Remark niteliğini güncellerken güncelleme koşulu olarak Remark kullanacağımızı görebiliriz.

İlk sql ifadesi başarıyla güncellenebilir, ardından yorum "not 1" olarak değiştirilir ve ikinci sql ifadesi güncellendiğinde, yorumun değeri değiştiği için güncelleme başarısız olur.

【Zaman Damgası İlkesi】

Tab2'ye RowVersion özelliği ekledik (istediğiniz ismi alabilirsiniz) ve Zaman Damgası özelliğini ekledik!!



Aynı verinin Name değerini aynı anda güncelliyoruz, ilk güncelleme başarılı oluyor, ikinci güncelleme başarısız oluyor ve bir istisna atılır, üretilen SQL koduna bir göz atalım!

exec sp_executesql N'UPDATE [dbo]. [Tab2]
SET [İsim] = @0
BURADA ((([Id] = @1) VE ([RowVersion] = @2)) VE ([Yorum] = @3))
SEÇ [RowVersion]
[dbo]'dan. [Tab2]
BURADA @@ROWCOUNT > 0 VE [Id] = @1',N'@0 nvarchar(max) ,@1 int,@2 binary(8),@3 nvarchar(max) ',@0=N'Name1',@1=1,@2=0x00000000000007D1,@3=N'Note'
exec sp_executesql N'UPDATE [dbo]. [Tab2]
SET [İsim] = @0
BURADA ((([Id] = @1) VE ([RowVersion] = @2)) VE ([Yorum] = @3))
SEÇ [RowVersion]
[dbo]'dan. [Tab2]
BURADA @@ROWCOUNT > 0 VE [Id] = @1',N'@0 nvarchar(max) ,@1 int,@2 binary(8),@3 nvarchar(max) ',@0=N'name2',@1=1,@2=0x00000000000007D1,@3=N'Note'

İkinci SQL ifadesi çalıştırılırken, where koşulu veri artık bulunamadığı için güncelleme başarısız olur ve bir istisna atılır!!

İlk sql ifadesi başarıyla çalıştırıldığında, RowVersion değeri değişir, aşağıdaki şekilde gösterilmiştir:





RowsVersion zaman damgasıdır

Eksik güncellemeler için geçici çözümler   

Eksik güncellemeler kavramı: Kullanıcılar aynı anda bir veri satırını değiştirdiklerinde, önce veriyi okur, ön uçta değiştirmek için ön tarafa koyarlar ve değiştirildiğinde veriyi gönderirler; böylece son gönderilen veri daha önce gönderilen verinin üzerine yazılır ve bu da güncellemenin kaybolmasına neden olur.

Uzun lafın kısası, güncellemeleri kaybetmenin yolları şunlar:

RowsVersion zaman damgasını kullanın.

Bir satır okumadan önceki değerle tutarsızsa, başka bir işlem bu sütunu güncelletmiş olur ve bu sütun güncellenemez, böylece güncellemelerin kaybı önlenir.



Son olarak, kaynak kodunu ekleyin:
CodeFirstDemo.rar (4.94 KB, İndirme sayısı: 13)




Önceki:nhibernate yerli birincil anahtar oluşturma politikası
Önümüzdeki:EF6, işlemleri yönetmek için Database.BeginTransaction kullanır
Yayınlandı 22.03.2022 11:51:38 |
Sıkı emek için teşekkürler, çok iyi bir gönderi
 Ev sahibi| Yayınlandı 1.11.2023 20:42:15 |
EF eşzamanlılık istisnası DbUpdateConcurrencyException önbelleklenmiş değeri yeniden sorgular
https://www.itsvse.com/thread-10692-1-1.html
 Ev sahibi| Yayınlandı 27.12.2023 19:54:01 |
EF Core optimistic lock rowversion oluşturulan göç ifadeleri




Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com