Konkurensi Optimis: Ringkasan
LINQ to SQL mendukung kontrol konkurensi optimis. Tabel berikut ini menjelaskan istilah yang berlaku untuk konkurensi optimis di dokumentasi LINQ to SQL:
Syarat | Deskripsi |
---|---|
konkurensi | Situasi di mana dua atau beberapa pengguna pada saat yang sama mencoba memperbarui baris database yang sama. |
konflik konkurensi | Situasi di mana dua atau beberapa pengguna pada saat yang sama mencoba mengirimkan nilai yang bertentangan ke satu atau beberapa kolom baris. |
kontrol konkurensi | Teknik yang digunakan untuk mengatasi konflik konkurensi. |
kontrol konkurensi optimis | Teknik yang pertama kali menyelidiki apakah transaksi lain telah mengubah nilai secara berturut-turut sebelum mengizinkan perubahan dikirimkan. Kontras dengan kontrol konkurensi pesimis, yang mengunci rekaman untuk menghindari konflik konkurensi. Kontrol optimis begitu disebut karena menganggap kemungkinan satu transaksi mengganggu transaksi lain tidak mungkin. |
resolusi konflik | Proses penyegaran item yang berkonflik dengan mengkueri database lagi lalu mendamaikan perbedaan. Saat objek direfresh, LINQ to SQL pelacak perubahan menyimpan data berikut: - Nilai yang awalnya diambil dari database dan digunakan untuk pemeriksaan pembaruan. - Nilai database baru dari kueri berikutnya. LINQ to SQL kemudian menentukan apakah objek bertentangan (yaitu, apakah satu atau beberapa nilai anggotanya telah berubah). Jika objek bertentangan, LINQ to SQL berikutnya menentukan anggotanya mana yang bertentangan. Setiap konflik anggota yang ditemukan LINQ ke SQL ditambahkan ke daftar konflik. |
Dalam model objek LINQ to SQL, konflik konkurensi optimis terjadi ketika kedua kondisi berikut ini benar:
Klien mencoba mengirimkan perubahan ke database.
Satu atau beberapa nilai pemeriksaan pembaruan telah diperbarui dalam database sejak klien terakhir membacanya.
Resolusi konflik ini termasuk menemukan anggota objek mana yang bertentangan, lalu memutuskan apa yang ingin Anda lakukan tentangnya.
Catatan
Hanya anggota yang dipetakan sebagai Always atau WhenChanged berpartisipasi dalam pemeriksaan konkurensi optimis. Tidak ada pemeriksaan yang dilakukan untuk anggota yang ditandai Never. Untuk informasi selengkapnya, lihat UpdateCheck .
Contoh
Misalnya, dalam skenario berikut, User1 mulai menyiapkan pembaruan dengan mengkueri database untuk baris. User1 menerima baris dengan nilai Alfreds, Maria, dan Sales.
User1 ingin mengubah nilai kolom Manajer menjadi Alfred dan nilai kolom Departemen menjadi Pemasaran. Sebelum Pengguna1 dapat mengirimkan perubahan tersebut, Pengguna2 telah mengirimkan perubahan ke database. Jadi sekarang nilai kolom Asisten telah diubah menjadi Mary dan nilai kolom Departemen menjadi Layanan.
Ketika User1 sekarang mencoba mengirimkan perubahan, pengiriman gagal dan ChangeConflictException pengecualian dilemparkan. Hasil ini terjadi karena nilai database untuk kolom Asisten dan kolom Departemen bukan yang diharapkan. Anggota yang mewakili kolom Asisten dan Departemen bertentangan. Tabel berikut ini meringkas situasi.
Provinsi | Manajer | Asisten | Departemen |
---|---|---|---|
Keadaan asli | Alfreds | Maria | Sales |
Pengguna1 | Alfred | Marketing | |
Pengguna2 | Mary | Layanan |
Anda dapat mengatasi konflik seperti ini dengan cara yang berbeda. Untuk informasi selengkapnya, lihat Cara: Mengelola Konflik Perubahan.
Daftar Periksa Deteksi dan Penyelesaian Konflik
Anda dapat mendeteksi dan mengatasi konflik pada tingkat detail apa pun. Pada satu ekstrem, Anda dapat mengatasi semua konflik dengan salah satu dari tiga cara (lihat RefreshMode) tanpa pertimbangan tambahan. Pada ekstrem lainnya, Anda dapat menunjuk tindakan tertentu untuk setiap jenis konflik pada setiap anggota yang bertentangan.
Tentukan atau revisi UpdateCheck opsi dalam model objek Anda.
Untuk informasi selengkapnya, lihat Cara: Menentukan Anggota mana yang Diuji untuk Konflik Konkurensi.
Di blok coba/tangkap panggilan Anda ke SubmitChanges, tentukan pada titik apa Anda ingin pengecualian dilemparkan.
Untuk informasi selengkapnya, lihat Cara: Menentukan Kapan Pengecualian Konkurensi Dilemparkan.
Tentukan berapa banyak detail konflik yang ingin Anda ambil, dan sertakan kode dalam blok coba/tangkap yang sesuai.
Untuk informasi selengkapnya, lihat Cara: Mengambil Informasi Konflik Entitas dan Cara: Mengambil Informasi Konflik Anggota.
Sertakan dalam kode Anda
try
/catch
bagaimana Anda ingin mengatasi berbagai konflik yang Anda temukan.Untuk informasi selengkapnya, lihat Cara: Mengatasi Konflik dengan Mempertahankan Nilai Database, Cara: Mengatasi Konflik dengan Menimpa Nilai Database, dan Cara: Mengatasi Konflik dengan Menggabungkan Nilai Database.
Jenis LINQ to SQL yang Mendukung Penemuan dan Resolusi Konflik
Kelas dan fitur untuk mendukung penyelesaian konflik dalam konkurensi optimis di LINQ to SQL meliputi hal-hal berikut: