Mengapa penguncian optimis lebih cepat daripada penguncian pesimistis?

9

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!

Mara
sumber
5
Penjelasan yang sangat singkat ada dalam penamaan. Penguncian yang optimis bekerja dengan baik ketika peluang kunci yang saling bertentangan rendah. Kami optimis tentang interaksi berbagai proses. Penguncian pesimistis bekerja dengan baik ketika peluang kunci yang saling bertentangan tinggi. Kami pesimis tentang interaksi berbagai proses. Keduanya akan tampil kurang optimal di mana kebalikannya akan lebih tepat.
Mark Storey-Smith
penguncian optimis mungkin atau mungkin tidak lebih cepat dari penguncian pesimistis, tergantung pada beban kerja Anda.
AK

Jawaban:

8

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.

Ali Razeghi
sumber
Terima kasih @Ali Razeghi (+1) - Saya pikir dba.se adalah tempat yang lebih tepat untuk pertanyaan ini. Juga, meskipun ini adalah jawaban yang luar biasa, itu tidak menjawab pertanyaan saya tentang kinerja (ketika yang satu lebih cepat dari yang lain). Terima kasih lagi!
Mara
Hai Mara, itu poin bagus. Saya telah memperluas jawabannya. Terima kasih.
Ali Razeghi
11

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."

Erwin Smout
sumber
1

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.

a1ex07
sumber
titik menarik a1ex07, penguncian optimsitic masih termasuk penguncian namun, seperti menulis akan selalu memblokir menulis lainnya, benar?
Ali Razeghi
Tidak, tidak. Itu sebabnya "lebih cepat".
Erwin Smout
Itu bisa menjadi kasus untuk Oracle tetapi untuk MS SQL Server, karena menggunakan tingkat isolasi 'baca komitmen' secara default, penguncian optimis akan memungkinkan pembaca dan penulis utas untuk bekerja secara bersamaan, tetapi penulisan akan memblokir penulisan sampai utas pemblokiran dilakukan.
Ali Razeghi
@Ali Razeghi: Saya tidak yakin saya mengikuti maksud Anda. Dalam SQLServer dengan penulis yang berkomitmen baca, blok pembaca secara default kecuali `READ_COMMITTED_SNAPSHOT` dihidupkan. Penguncian yang optimis bukanlah penguncian pada sumber db (baris / halaman / tabel), melainkan semacam perjanjian antara semua aplikasi yang menggunakan basis data untuk tidak memperbarui catatan jika versi tidak sesuai dengan yang diharapkan.
a1ex07
1
@Eamon Nerbonne: Saya katakan tentang 'penulis tidak menghalangi pembaca' ... Di mana Anda melihat saya menyebutkan sesuatu tentang "penulis memblokir / jangan memblokir penulis"?
a1ex07
0

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

Premraj
sumber
-3

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:

SELECT COUNT(*) FROM atable

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!

pengguna7370003
sumber
4
Pendekatan kontrol konkurensi DBMS adalah ortogonal untuk penguncian optimis / pesimistis, dan membandingkan waktu menjalankan kueri dalam dua DBMS yang berbeda menyesatkan.
mustaccio
karena SQL Server dapat melakukan dua mode penguncian Anda dapat dengan mudah membandingkan ini dengan melakukan becnhmark nyata dalam pendekatan konkurensi pengguna.
user7370003