Kedua bentuk penguncian menyebabkan proses menunggu salinan catatan yang benar jika saat ini sedang digunakan oleh proses lain. Dengan penguncian pesimis, mekanisme kunci berasal dari DB itu sendiri (objek kunci asli), sedangkan dengan penguncian optimis, mekanisme kunci adalah beberapa bentuk versi baris seperti cap waktu untuk memeriksa apakah catatan "basi" atau tidak.
Tapi keduanya menyebabkan proses ke-2 hang. Jadi saya bertanya: mengapa penguncian optimis umumnya dianggap lebih cepat / lebih unggul daripada penguncian pesimistis? Dan, apakah ada kasus penggunaan di mana pesimistis lebih disukai daripada optimis? Terima kasih sebelumnya!
performance
locking
rdbms
Mara
sumber
sumber
Jawaban:
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:
Itulah pemikiran saya tentang masalah ini, terbuka untuk mendengar lebih banyak dari masyarakat.
sumber
Anda salah memahami penguncian optimis.
Penguncian yang optimis tidak menyebabkan transaksi saling menunggu.
Penguncian yang optimis mungkin menyebabkan transaksi gagal, tetapi ia melakukannya tanpa "kunci" apa pun yang pernah diambil. Dan jika transaksi gagal karena penguncian yang optimis, pengguna harus memulai dari awal lagi. Kata "optimis" berasal dari ekspektasi persis bahwa kondisi yang menyebabkan transaksi gagal karena alasan ini, hanya akan terjadi dengan sangat luar biasa. Penguncian "optimis" adalah pendekatan yang mengatakan "Saya tidak akan mengambil kunci yang sebenarnya karena saya berharap mereka tidak akan diperlukan. Jika ternyata saya salah tentang itu, saya akan menerima kegagalan yang tak terelakkan."
sumber
Penguncian optimis umumnya lebih cepat karena sebenarnya tidak ada penguncian dari sudut pandang basis data. Ini sepenuhnya tergantung pada aplikasi apakah akan menghormati kolom versi (atau pseudo-kolom, seperti ora_rowscn) atau tidak. Biasanya Anda memiliki banyak aplikasi yang terhubung ke database yang sama, jadi db menjadi sumber daya bersama, dan jika hang, semua klien akan terpengaruh.
Dengan strategi penguncian yang optimis, 'menggantung' terjadi di sisi klien dan tidak memengaruhi orang lain.
Namun, jika catatan sering diperbarui, Anda mungkin berakhir membacanya berulang kali (dalam kasus penguncian optimis), sehingga mengalahkan manfaat strategi optimis yang paling banyak.
Saya tidak setuju tentang superioritas dari kedua pendekatan; keduanya bisa disalahgunakan. Pesimis lebih rentan kesalahan hanya karena itu lebih berbahaya: penguncian terjadi pada tingkat db, tergantung pada RDMS Anda mungkin tidak memiliki kontrol pada apa yang dikunci (kunci eskalasi), Anda harus mengurus penguncian pesanan secara manual.
sumber
Penguncian yang optimis mengasumsikan transaksi bersamaan dapat diselesaikan tanpa mempengaruhi satu sama lain. Jadi penguncian Optimis lebih cepat karena tidak ada kunci yang dipaksakan saat melakukan transaksi. Ini pencegahan agar masalah konkurensi tidak sembuh. Transaksi hanya memverifikasi (tiga cara Kumpulan Data, tipe Data Timestamp, Periksa nilai lama dan baru) data yang tidak ada transaksi lain yang memodifikasi data. Dalam hal modifikasi transaksi dibatalkan.
Penguncian pesimis mengasumsikan bahwa transaksi bersamaan akan bertentangan satu sama lain, sehingga memerlukan kunci, hal itu dilakukan dengan menentukan tingkat ISOLASI (Baca Tidak Berkomitmen, Baca Berkomitmen, Baca Berulang, dan Serializable) dari manajemen transaksi. Ini menyembuhkan masalah konkurensi dengan memperoleh kunci. kunci berfungsi untuk melindungi sumber daya atau objek yang dibagikan (Tabel, Baris Data, Blok Data, Item yang Di-cache, Koneksi dan Seluruh Sistem). Kami memiliki banyak jenis kunci seperti kunci bersama, kunci pembaruan, kunci inset, kunci eksklusif, kunci transaksi, kunci DML, kunci skema, dan kunci cadangan-pemulihan.
untuk mendapatkan lebih banyak ide
sumber
Adalah salah untuk mengatakan bahwa penguncian pesimistis lebih lambat daripada optimis atau mengatakan bahwa optimis lebih cepat. Satu pertanyaan klasik untuk menunjukkan cara berpikir yang tidak tepat ini adalah melakukan agregat pada RDBMS yang berbeda, seperti:
Anda akan melihat bahwa, dalam RDBMS yang mendukung pendekatan optimis asli, waktu yang dibutuhkan oleh kueri ini jauh lebih signifikan daripada mereka yang memiliki kunci asli pesimis
Sebagai contoh pada PC saya, permintaan yang sama mengambil 27 ms pada SQL Server dan 109 pada PostGreSQL ...
Overhead tambahan yang diperlukan dalam membaca versi mati baris MVCC dan tidak menghitung catatan hantu dalam agregat menambahkan biaya tambahan yang tidak dimiliki oleh pesimis!
sumber