Bagikan melalui


Konkurensi optimis

Konkurensi optimis memperoleh namanya dari asumsi optimis bahwa tabrakan antara transaksi akan jarang terjadi; tabrakan dikatakan terjadi ketika transaksi lain memperbarui atau menghapus baris data antara waktu dibaca oleh transaksi saat ini dan waktu diperbarui atau dihapus. Ini adalah kebalikan dari konkurensi pesimis, atau penguncian, di mana pengembang aplikasi percaya bahwa tabrakan semacam itu adalah hal yang biasa.

Dalam konkurensi optimis, baris dibiarkan tidak terkunci hingga waktunya tiba untuk memperbarui atau menghapusnya. Pada titik itu, baris dibaca ulang dan diperiksa untuk melihat apakah baris tersebut telah diubah sejak terakhir dibaca. Jika baris telah berubah, pembaruan atau penghapusan gagal dan harus dicoba lagi.

Untuk menentukan apakah baris telah diubah, versi barunya diperiksa terhadap versi baris yang di-cache. Pemeriksaan ini dapat didasarkan pada versi baris, seperti kolom tanda waktu di SQL Server, atau nilai setiap kolom dalam baris. Banyak DBMS tidak mendukung versi baris.

Konkurensi optimis dapat diimplementasikan oleh sumber data atau aplikasi. Dalam kedua kasus, aplikasi harus menggunakan tingkat isolasi transaksi rendah seperti Baca Diterapkan; menggunakan tingkat yang lebih tinggi meniadakan peningkatan konkurensi yang diperoleh dengan menggunakan konkurensi optimis.

Jika konkurensi optimis diterapkan oleh sumber data, aplikasi mengatur atribut pernyataan SQL_ATTR_CONCURRENCY ke SQL_CONCUR_ROWVER atau SQL_CONCUR_VALUES. Untuk memperbarui atau menghapus baris, baris menjalankan pernyataan pembaruan atau penghapusan yang diposisikan atau memanggil SQLSetPos seperti halnya dengan konkurensi pesimis; driver atau sumber data mengembalikan SQLSTATE 01001 (Konflik operasi kursor) jika pembaruan atau penghapusan gagal karena tabrakan.

Jika aplikasi itu sendiri menerapkan konkurensi optimis, aplikasi menetapkan atribut pernyataan SQL_ATTR_CONCURRENCY ke SQL_CONCUR_READ_ONLY untuk membaca baris. Jika akan membandingkan versi baris dan tidak mengetahui kolom versi baris, ia memanggil SQLSpecialColumns dengan opsi SQL_ROWVER untuk menentukan nama kolom ini.

Aplikasi memperbarui atau menghapus baris dengan meningkatkan konkurensi ke SQL_CONCUR_LOCK (untuk mendapatkan akses tulis ke baris) dan menjalankan pernyataan UPDATE atau DELETE dengan klausul WHERE yang menentukan versi atau nilai yang dimiliki baris saat aplikasi membacanya. Jika baris telah berubah sejak saat itu, pernyataan akan gagal. Jika klausa WHERE tidak mengidentifikasi baris secara unik, pernyataan mungkin juga memperbarui atau menghapus baris lain; versi baris selalu mengidentifikasi baris secara unik, tetapi nilai baris secara unik mengidentifikasi baris hanya jika menyertakan kunci utama.