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)
|