Bagikan melalui


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.

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:

Lihat juga