Pertanyaan:
SELECT COUNT(online.account_id) cnt from online;
Tetapi meja online juga dimodifikasi oleh suatu peristiwa, jadi sering saya bisa melihat kunci dengan berlari show processlist
.
Apakah ada tata bahasa di MySQL yang dapat membuat pernyataan pilih tidak menyebabkan kunci?
Dan saya lupa menyebutkan di atas bahwa itu ada di database budak MySQL.
Setelah saya menambahkan ke my.cnf:transaction-isolation = READ-UNCOMMITTED
dalam slave akan menemui kesalahan:
Kesalahan 'Pencatatan biner tidak dimungkinkan. Pesan: Level transaksi 'READ-UNCOMMITTED' di InnoDB tidak aman untuk mode binlog 'STATEMENT' 'pada permintaan
Jadi, apakah ada cara yang kompatibel untuk melakukan ini?
Jawaban:
Menemukan sebuah artikel berjudul "MYSQL WITH NOLOCK"
https://web.archive.org/web/20100814144042/http://sqldba.org/articles/22-mysql-with-nolock.aspx
di MS SQL Server Anda akan melakukan hal berikut:
dan setara MYSQL adalah
EDIT
Michael Mior menyarankan yang berikut (dari komentar)
sumber
SESSION
dan dengan demikian tingkat transaksi hanya berlaku untuk transaksi berikutnya. Kemudian, cukup ganti pernyataan ketiga di atas denganCOMMIT
. Ini akan menjadi noop dalam hal ini, tetapi memiliki efek samping untuk mengakhiri transaksi dan mengatur ulang ke tingkat isolasi default.SET TRANSACTION
pernyataan tersebut : "Pernyataan ini menetapkan tingkat isolasi transaksi, yang digunakan untuk operasi pada tabel InnoDB."Jika tabelnya adalah InnoDB, lihat http://dev.mysql.com/doc/refman/5.1/en/innodb-consistent-read.html - tabel ini menggunakan baca-konsisten (mode tanpa-penguncian) untuk SELECT "yang melakukan tidak menentukan FOR UPDATE atau LOCK IN SHARE MODE jika opsi innodb_locks_unsafe_for_binlog diatur dan tingkat isolasi transaksi tidak diatur ke SERIALIZABLE. Dengan demikian, tidak ada kunci yang ditetapkan pada baris yang dibaca dari tabel yang dipilih ".
sumber
Menggunakan
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED.
Versi 5.0 Documents ada di sini .
Versi 5.1 Documents ada di sini .
sumber
Anda mungkin ingin membaca halaman ini dari manual MySQL. Bagaimana meja dikunci tergantung pada jenis tabel itu.
MyISAM menggunakan kunci tabel untuk mencapai kecepatan baca yang sangat tinggi, tetapi jika Anda memiliki pernyataan UPDATE yang menunggu, maka SELECTS di masa mendatang akan mengantri di belakang UPDATE.
Tabel InnoDB menggunakan penguncian tingkat baris, dan Anda tidak akan memiliki seluruh tabel terkunci di belakang PEMBARUAN. Ada beberapa jenis masalah penguncian yang terkait dengan InnoDB, tetapi Anda mungkin menemukannya cocok dengan kebutuhan Anda.
sumber
Tergantung pada jenis tabel Anda, penguncian akan tampil berbeda, tetapi begitu juga SELECT akan dihitung. Untuk tabel MyISAM hitungan SELECT sederhana (*) DARI tabel tidak boleh mengunci tabel karena mengakses data meta untuk menarik jumlah catatan. Innodb akan memakan waktu lebih lama karena harus mengambil tabel dalam snapshot untuk menghitung catatan, tetapi seharusnya tidak menyebabkan penguncian.
Anda setidaknya harus mengatur concurrent_insert ke 1 (default). Kemudian, jika tidak ada "celah" dalam file data untuk tabel untuk diisi, sisipan akan ditambahkan ke file dan SELECT dan INSERT dapat terjadi secara bersamaan dengan tabel MyISAM. Perhatikan bahwa menghapus catatan akan membuat "celah" pada file data yang akan berusaha diisi dengan sisipan dan pembaruan di masa mendatang.
Jika Anda jarang menghapus catatan, maka Anda dapat mengatur concurrent_insert sama dengan 2, dan sisipan akan selalu ditambahkan ke akhir file data. Kemudian pilih dan sisipan dapat terjadi secara bersamaan, tetapi file data Anda tidak akan pernah menjadi lebih kecil, tidak peduli berapa banyak catatan yang Anda hapus (kecuali semua catatan).
Intinya, jika Anda memiliki banyak pembaruan, menyisipkan, dan memilih pada tabel, Anda harus membuatnya InnoDB. Anda dapat dengan bebas mencampur tipe tabel dalam suatu sistem.
sumber
cara lain untuk mengaktifkan read kotor di mysql adalah menambahkan petunjuk: LOCK IN SHARE MODE
sumber
Dari referensi ini :
sumber
SELECT biasanya tidak melakukan penguncian yang Anda pedulikan di tabel InnoDB. Tingkat isolasi transaksi default berarti bahwa pemilih tidak mengunci barang.
Tentu saja pertengkaran masih terjadi.
sumber
show processlist
untuk benar-benar melihat kunci. Jadi aman untuk mengasumsikan bahwa sebenarnya ada kunci yang diambil.