Saya harus memperbarui program untuk memungkinkan kebuntuan. Apakah mungkin SELECT
pernyataan itu akan menghasilkan kesalahan jalan buntu? Saya tahu bahwa ini hanya kunci baca sehingga banyak pilihan tidak akan menjadi masalah, tetapi bagaimana jika ada INSERT
, UPDATE
atau DELETE
pernyataan (dengan subquery yang dimungkinkan dengan gabungan) dan SELECT
pernyataan (mungkin dengan gabungan atau subkueri) ?
Apakah mungkin bahwa kesalahan akan dilemparkan pada SELECT
bukan INSERT
, UPDATE
atau DELETE
.
Jawaban:
Jawaban langsung untuk judul pertanyaan Anda adalah Tidak.
SELECT query dapat melakukan kunci pada gen_clust_index , alias Indeks Clustered.
Berikut adalah tiga pertanyaan DBA Stack Exchanges yang saya teliti dengan @RedBlueThing , orang yang menanyakan pertanyaan-pertanyaan ini. @RedBlueThing menemukan pekerjaan sekitar untuk pertanyaannya.
Hanya untuk menjaga pertanyaan Anda dalam perspektif, ketika Anda melihat jawaban ini (jangan melihat terlalu dalam, bahkan saya pusing melihat jawaban saya yang berbelit-belit) harus segera jelas bahwa pertanyaan SELECT dapat mengunci data.
Anda juga memiliki kasus SELECT khusus di mana Anda dapat mengunci baris tertentu berdasarkan permintaan .
UPDATE 2011-08-08 16:49 EDT
Anda mengajukan pertanyaan variasi: "Apakah pengecualian kebuntuan InnoDB mungkin akan dilempar oleh SELECT" Jawabannya bisa berupa Ya dalam kondisi tertentu. Kondisi apa itu? Jika hanya satu pernyataan SQL yang dibatalkan karena kesalahan, beberapa kunci yang ditetapkan oleh pernyataan tersebut dapat dipertahankan. Ini terjadi karena InnoDB menyimpan kunci baris dalam format yang tidak dapat diketahui sesudahnya kunci mana yang ditetapkan oleh pernyataan mana .
Berdasarkan pernyataan itu, urutan peristiwa yang menyebabkan hal ini secara teoritis dapat sebagai berikut:
Secara pribadi, pernyataan terakhir itu membuatku takut. Akan lebih baik bagi MySQL untuk memberi tahu semua orang tentang kekhasan ini. Namun, pernyataan itu dari Dokumentasi MySQL. (Oh ya, Oracle memiliki InnoDB)
UPDATE 2015-09-22 18:40 EST
Pada awal tahun, saya mengetahui bahwa Percona memiliki cek Nagi yang keren untuk menemukan kunci-kunci sial ini bersembunyi di balik koneksi yang tertidur. Yang harus Anda lakukan sekarang adalah menjalankan kode dari tautan itu:
Ini hanya akan berfungsi untuk MySQL 5.5+. Jika Anda memiliki MySQL 5.1 atau sebelumnya, Anda harus membunuh semua koneksi tidur untuk melepaskan kunci.
sumber
for update
tentu saja)?select
dapat mengunci baris atau dengan cara apa pun diblokir oleh DML dalam transaksi lain. Itu tentu benar untuk Oracle dan sejauh yang saya tahu itu juga berlaku untuk InnoDB? Kecuali perkara ketikaselect
pernyataan benar-benar melakukan DML melalui suatu fungsi atau rute putaran lain tentu saja.