Pertanyaan rangkap dari:
/programming/129329/optimistic-vs-pessimistic-locking
Salin / Tempel jawaban dari tautan di atas:
Penguncian Optimis adalah strategi di mana Anda membaca catatan, mencatat nomor versi dan memeriksa apakah versi tersebut tidak berubah sebelum Anda menulis catatan kembali. Saat Anda menulis catatan kembali, Anda memfilter pembaruan pada versi untuk memastikan itu atom. (Yaitu belum diperbarui antara saat Anda memeriksa versi dan menulis catatan ke disk) dan memperbarui versi dalam satu pukulan.
Jika catatan kotor (yaitu versi berbeda dengan milik Anda), Anda membatalkan transaksi dan pengguna dapat memulai kembali.
Strategi ini paling berlaku untuk sistem volume tinggi dan arsitektur tiga tingkat di mana Anda tidak perlu menjaga koneksi ke database untuk sesi Anda. Dalam situasi ini klien tidak dapat benar-benar menjaga kunci basis data karena koneksi diambil dari kumpulan dan Anda mungkin tidak menggunakan koneksi yang sama dari satu akses ke yang berikutnya.
Penguncian Pesimis adalah ketika Anda mengunci catatan untuk penggunaan eksklusif Anda sampai Anda selesai dengan itu. Ini memiliki integritas yang jauh lebih baik daripada penguncian optimis tetapi mengharuskan Anda untuk berhati-hati dengan desain aplikasi Anda untuk menghindari Deadlock. Untuk menggunakan penguncian pesimistis, Anda memerlukan koneksi langsung ke database (seperti yang biasanya terjadi pada aplikasi server klien dua tingkat) atau ID transaksi yang tersedia secara eksternal yang dapat digunakan secara terpisah dari koneksi.
Dalam kasus terakhir Anda membuka transaksi dengan TxID dan kemudian menyambung kembali menggunakan ID itu. DBMS mempertahankan kunci dan memungkinkan Anda untuk mengambil kembali sesi melalui TxID. Ini adalah cara transaksi terdistribusi menggunakan protokol komit dua fase (seperti XA atau COM + Transaksi) bekerja.
Edit (Menambahkan lebih banyak info untuk menjawab pertanyaan kinerja):
Kinerja bijaksana itu tergantung pada lingkungan Anda. Ambil faktor-faktor berikut untuk memutuskan:
Anda akan menemukan optimisme akan lebih baik karena konkurensi dalam kebanyakan situasi. Bergantung pada RDBMS dan lingkungan, ini mungkin kurang atau lebih berkinerja. Biasanya dengan penguncian Optimis Anda akan menemukan bahwa nilai perlu baris versi di suatu tempat.
Sebagai contoh, dengan MS SQL Server, ia dipindahkan ke TempDB dan sesuatu antara 12-14 byte ditambahkan pada akhir kolom. Menghidupkan penguncian optimis dengan tingkat isolasi seperti Snapshot Isolasi dapat menyebabkan fragmentasi dan faktor isi Anda perlu disesuaikan karena baris sekarang memiliki data tambahan di akhir yang dapat menyebabkan halaman hampir penuh menyebabkan perpecahan halaman, yang akan menurunkan penampilanmu. Jika TempDB Anda di bawah optimal maka ini tidak akan secepat.
Jadi saya kira daftar periksa adalah:
- -Apakah Anda memiliki IO / sumber daya yang cukup untuk menangani bentuk versi baris? Jika tidak, Anda menambahkan overhead. Jika demikian, maka jika Anda sering membaca data sementara Anda sering menguncinya untuk menulis, Anda akan melihat peningkatan yang baik pada konkurensi di antara membaca dan menulis (meskipun menulis masih akan memblokir menulis, membaca tidak akan lagi memblokir menulis dan sebaliknya)
- -Apakah kode Anda rentan terhadap kebuntuan atau apakah Anda mengalami penguncian? Jika Anda tidak mengalami kunci yang panjang atau banyak deadlock, maka overhead tambahan dari penguncian Optimis tidak akan membuat segalanya lebih cepat, tentu saja, dalam banyak kasus kita berbicara milidetik di sini.
- -Jika DB Anda besar (atau pada perangkat keras yang sangat terbatas) dan halaman data Anda hampir penuh, tergantung pada RDBMS, Anda dapat menyebabkan pemisahan halaman utama dan fragmentasi data jadi pastikan untuk mempertimbangkan pengindeksan ulang setelah dinyalakan.
Itulah pemikiran saya tentang masalah ini, terbuka untuk mendengar lebih banyak dari masyarakat.