Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 42676|Jawab: 4

[Sumber] Menangani perbedaan Timestamp dan ConcurrencyCheck bersamaan

[Salin tautan]
Diposting pada 08/04/2017 00.10.50 | | | |


Penuliswww.itsvse.com @小渣渣 !
Berhasil memasukkan data dasar!
Menguji fitur ConcurrencyCheck selesai
Pembaruan berhasil! Catatan 1
Pembaruan luar biasa! Catatan 2, informasi abnormal! Pernyataan penyimpanan, pembaruan, penyisipan, atau hapus memengaruhi jumlah baris yang tidak terduga (0). Entitas mungkin telah dimodifikasi atau dihapus sejak entitas dimuat. Lihat http://go.microsoft.com/fwlink/?LinkId=472540 untuk informasi tentang memahami dan menangani pengecualian konkurensi optimis.

Uji perbedaan antara Timestamp dan ConcurrencyCheck
Pembaruan UpdateTab1 berhasil! Nama 1
Pembaruan UpdateTab2 berhasil! Nama 1
Pembaruan UpdateTab2 tidak normal! Nama 2, informasi abnormal! Pernyataan penyimpanan, pembaruan, penyisipan, atau hapus memengaruhi jumlah baris yang tidak terduga (0). Entitas mungkin telah dimodifikasi atau dihapus sejak entitas dimuat. Lihat http://go.microsoft.com/fwlink/?LinkId=472540 untuk informasi tentang memahami dan menangani pengecualian konkurensi optimis.
Pembaruan UpdateTab1 berhasil! Nama 2

【Stempel Waktu】
Fitur TimeStamp dapat diterapkan ke kelas bidang, yang hanya memiliki satu properti array byte, dan fitur ini mengatur jenis tiemStamp ke kolom. Dalam pemeriksaan bersamaan, Code-First secara otomatis menggunakan bidang jenis TimeStamp ini.

【Pemeriksaan Konkurensi】
Fitur ConcurrencyCheck dapat diterapkan ke properti kelas domain. Saat EF melakukan operasi pembaruan, Code-First menempatkan nilai kolom dalam pernyataan kondisi where, dan Anda dapat menggunakan fitur CurrencyCheck ini untuk menggunakan kolom yang ada untuk pemeriksaan konkurensi, daripada menggunakan kolom TimeStamp terpisah untuk pemeriksaan konkurensi.

Mari kita mulai dengan membuat objek konteks baru untuk menunjukkan perbedaan antara Timestamp dan ConcurrencyCheck dalam pemrosesan konkurensi!

Berikut kode untuk konteksnya:




Mari kita lihat kolom database, sebagai berikut:



Kita akan menemukan bahwa tab1 dan tab2 memiliki kolom Id, Name, dan Remark, dan tab2 memiliki lebih banyak kolom RowVersion daripada tab1.

Lampirkan kode pengujian terlebih dahulu:



【Prinsip Pemeriksaan Konkurensi】



Kami menambahkan fitur ConcurrencyCheck ke properti Remark Tab1,


Saat kita memperbarui nilai atribut Name dari data yang sama pada saat yang sama, tidak ada pengecualian yang dilemparkan!


Hasilkan pernyataan SQL:


eksekutif sp_executesql N'UPDATE [dbo]. [Tab 1]
SET [Nama] = @0
DI MANA (([id] = @1) DAN ([Komentar] = @2))
',N'@0 nvarchar(maks) ,@1 int,@2 nvarchar(maks) ',@0=N'name1',@1=1,@2=N'Note1'
eksekutif sp_executesql N'UPDATE [dbo]. [Tab 1]
SET [Nama] = @0
DI MANA (([id] = @1) DAN ([Komentar] = @2))
',N'@0 nvarchar(maks) ,@1 int,@2 nvarchar(maks) ',@0=N'name2',@1=1,@2=N'note1'

Saat kita memperbarui nilai properti Remark dari data yang sama pada saat yang sama, kita melemparkan pengecualian!

Hasilkan pernyataan SQL:

eksekutif sp_executesql N'UPDATE [dbo]. [Tab 1]
SET [Keterangan] = @0
DI MANA (([id] = @1) DAN ([Komentar] = @2))
',N'@0 nvarchar(maks) ,@1 int,@2 nvarchar(maks) ',@0=N'Note1',@1=1,@2=N'Catatan'
eksekutif sp_executesql N'UPDATE [dbo]. [Tab 1]
SET [Keterangan] = @0
DI MANA (([id] = @1) DAN ([Komentar] = @2))
',N'@0 nvarchar(maks) ,@1 int,@2 nvarchar(maks) ',@0=N'Catatan 2',@1=1,@2=N'Catatan'

Kita dapat menemukan bahwa jika kita mengambil data yang sama dengan Id 1 pada saat yang sama, kita akan mendapatkan nilai atribut Remark, dan saat memperbarui atribut Remark, kita akan menggunakan Remark sebagai kondisi pembaruan.

Pernyataan sql pertama dapat berhasil diperbarui, dan kemudian komentar diubah menjadi "catatan 1", dan ketika pernyataan sql kedua diperbarui, pembaruan akan gagal karena nilai komentar telah berubah.

【Prinsip Stempel Waktu】

Kami menambahkan properti RowVersion ke Tab2 (Anda dapat mengambil nama apa pun) dan menambahkan fitur Timestamp!!



Saat kita memperbarui nilai Name dari data yang sama pada saat yang sama, pembaruan pertama berhasil, pembaruan kedua gagal, dan pengecualian dilemparkan, mari kita lihat kode sql yang dihasilkan!

eksekutif sp_executesql N'UPDATE [dbo]. [Tab 2]
SET [Nama] = @0
DI MANA ((([id] = @1) DAN ([RowVersion] = @2)) DAN ([Komentar] = @3))
PILIH [RowVersion]
DARI [dbo]. [Tab 2]
DI MANA @@ROWCOUNT > 0 DAN [Id] = @1',N'@0 nvarchar(maks) ,@1 int,@2 biner(8),@3 nvarchar(maks) ',@0=N'Nama1',@1=1,@2=0x00000000000007D1,@3=N'Catatan'
eksekutif sp_executesql N'UPDATE [dbo]. [Tab 2]
SET [Nama] = @0
DI MANA ((([id] = @1) DAN ([RowVersion] = @2)) DAN ([Komentar] = @3))
PILIH [RowVersion]
DARI [dbo]. [Tab 2]
WHERE @@ROWCOUNT > 0 DAN [Id] = @1',N'@0 nvarchar(max) ,@1 int,@2 biner(8),@3 nvarchar(max) ',@0=N'name2',@1=1,@2=0x00000000000007D1,@3=N'Note'

Saat mengeksekusi pernyataan SQL kedua, karena data kondisi where tidak dapat lagi ditemukan, pembaruan gagal dan pengecualian dilemparkan!!

Setelah pernyataan sql pertama berhasil dieksekusi, nilai RowVersion akan berubah, seperti yang ditunjukkan pada gambar di bawah ini:





RowsVersion adalah stempel waktu

Solusi untuk pembaruan yang hilang   

Konsep pembaruan yang hilang: Saat pengguna memodifikasi baris data secara bersamaan, mereka terlebih dahulu membaca data, meletakkannya di ujung depan untuk dimodifikasi, lalu mengirimkan data saat dimodifikasi, sehingga data akhir yang dikirimkan akan menimpa data yang dikirimkan sebelumnya, yang menyebabkan pembaruan hilang.

Singkat cerita, berikut adalah cara untuk mencegah kehilangan pembaruan:

Gunakan stempel waktu RowsVersion.

Jika baris tidak konsisten dengan nilai sebelum membaca, itu berarti transaksi lain telah memperbarui kolom ini, sehingga kolom ini tidak dapat diperbarui, sehingga mencegah hilangnya pembaruan.



Terakhir, lampirkan kode sumber:
CodeFirstDemo.rar (4.94 KB, Jumlah unduhan: 13)




Mantan:nhibernate kebijakan pembuatan kunci utama asli
Depan:EF6 menggunakan Database.BeginTransaction untuk mengelola transaksi
Diposting pada 22/03/2022 11.51.38 |
Terima kasih atas kerja kerasnya, posting yang sangat bagus
 Tuan tanah| Diposting pada 01/11/2023 20.42.15 |
Pengecualian konkurensi EF DbUpdateConcurrencyException mengkueri ulang nilai yang di-cache
https://www.itsvse.com/thread-10692-1-1.html
 Tuan tanah| Diposting pada 27/12/2023 19.54.01 |
Baris kunci optimis EF Core, versi migrasi yang dihasilkan




Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com