Saya menjalankan UPDATE
pernyataan MySQL berikut :
mysql> update customer set account_import_id = 1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
Saya tidak menggunakan transaksi, jadi mengapa saya mendapatkan kesalahan ini? Saya bahkan mencoba me-restart server MySQL saya dan itu tidak membantu.
Tabel ini memiliki 406.733 baris.
mysql
sql
timeout
lock-timeout
Jason Swett
sumber
sumber
process
untuk diam. Jika demikian, Anda bisa mendapatkan kesalahan ini. Apakah saya benar?connection.commit()
untuk melakukanINSERT
atauUPDATE
Anda baru saja melewatinya.CARA MEMBUAT UNLOCK untuk mengunci tabel di MySQL:
Memecahkan kunci seperti ini dapat menyebabkan atomicity dalam database tidak ditegakkan pada pernyataan sql yang menyebabkan kunci.
Ini peretasan, dan solusi yang tepat adalah memperbaiki aplikasi Anda yang menyebabkan kunci. Namun, ketika dolar ada di telepon, tendangan cepat akan membuat segalanya bergerak kembali.
1) Masukkan MySQL
2) Mari kita lihat daftar tabel yang terkunci
3) Mari kita lihat daftar proses saat ini, salah satunya adalah mengunci meja Anda
4) Bunuh salah satu dari proses ini
sumber
Sekarang picu kunci lagi. Anda memiliki waktu 100 detik untuk mengeluarkan
SHOW ENGINE INNODB STATUS\G
ke database dan melihat transaksi lain mana yang mengunci milik Anda.sumber
lock_wait_timeout
nilaiLihatlah apakah database Anda telah disesuaikan. Terutama isolasi transaksi. Bukan ide yang baik untuk meningkatkan variabel innodb_lock_wait_timeout.
Periksa tingkat isolasi transaksi database Anda di cli mysql:
Anda bisa mendapatkan perbaikan yang mengubah tingkat isolasi, gunakan oracle seperti BACA BERKOMITMASI alih-alih BACA ULANG (Default InnoDB)
Coba juga gunakan SELECT FOR UPDATE hanya jika diperlukan.
sumber
tx_isolation
variabel menjaditransaction_isolation
.Tidak ada solusi yang disarankan bekerja untuk saya tetapi ini berhasil.
Sesuatu memblokir eksekusi kueri. Kemungkinan besar permintaan lain memperbarui, menyisipkan, atau menghapus dari salah satu tabel dalam permintaan Anda. Anda harus mencari tahu apa itu:
Setelah Anda menemukan proses pemblokiran, temukan
id
dan jalankan:Jalankan kembali permintaan awal Anda.
sumber
100% dengan apa yang dikatakan MarkR. autocommit menjadikan setiap pernyataan transaksi satu pernyataan.
SHOW ENGINE INNODB STATUS
harus memberi Anda beberapa petunjuk tentang alasan kebuntuan. Lihat baik-baik pada log kueri lambat Anda juga untuk melihat apa lagi yang meng-query tabel dan mencoba untuk menghapus apa pun yang melakukan tablescan penuh. Penguncian tingkat baris berfungsi dengan baik tetapi tidak ketika Anda mencoba untuk mengunci semua baris!sumber
Bisakah Anda memperbarui catatan lain dalam tabel ini, atau tabel ini banyak digunakan? Apa yang saya pikirkan adalah bahwa ketika sedang berusaha untuk mendapatkan kunci yang diperlukan untuk memperbarui catatan ini batas waktu yang telah ditentukan telah habis. Anda mungkin dapat menambah waktu yang dapat membantu.
sumber
innodb_lock_wait_timeout
dimy.cnf
Jumlah baris tidak besar ... Buat indeks di account_import_id jika bukan kunci utama.
sumber
Jika Anda baru saja membunuh permintaan besar, itu akan membutuhkan waktu
rollback
. Jika Anda mengeluarkan kueri lain sebelum kueri yang terbunuh selesai bergulir kembali, Anda mungkin mendapatkan kesalahan batas waktu kunci. Itulah yang terjadi pada saya. Solusinya hanya menunggu sebentar.Detail:
Saya telah mengeluarkan permintaan DELETE untuk menghapus sekitar 900.000 dari sekitar 1 juta baris.
Saya menjalankan ini secara tidak sengaja (hanya menghapus 10% dari baris):
DELETE FROM table WHERE MOD(id,10) = 0
Alih-alih ini (menghapus 90% dari baris):
DELETE FROM table WHERE MOD(id,10) != 0
Saya ingin menghapus 90% dari baris, bukan 10%. Jadi saya membunuh proses di baris perintah MySQL, mengetahui bahwa itu akan memutar kembali semua baris yang telah dihapus sejauh ini.
Kemudian saya menjalankan perintah yang benar segera, dan mendapat
lock timeout exceeded
kesalahan segera setelah itu. Saya menyadari bahwa kunci itu mungkin sebenarnya adalahrollback
permintaan yang terbunuh yang masih terjadi di latar belakang. Jadi saya menunggu beberapa detik dan menjalankan kembali kueri.sumber
Pastikan tabel database menggunakan mesin penyimpanan InnoDB dan tingkat isolasi transaksi READ-COMMITTED.
Anda dapat memeriksanya dengan SELECT @@ GLOBAL.tx_isolation, @@ tx_isolation; di konsol mysql.
Jika tidak diatur untuk BACA-BERKOMITMEN maka Anda harus mengaturnya. Pastikan sebelum mengaturnya bahwa Anda memiliki hak SUPER di mysql.
Anda dapat mengambil bantuan dari http://dev.mysql.com/doc/refman/5.0/id/set-transaction.html .
Dengan mengatur ini saya pikir masalah Anda akan terpecahkan.
Anda mungkin juga ingin memeriksa bahwa Anda tidak berusaha memperbarui ini dalam dua proses sekaligus. Pengguna (@tala) telah menemui pesan kesalahan serupa dalam konteks ini, mungkin periksa ulang ...
sumber
Saya berasal dari Google dan saya hanya ingin menambahkan solusi yang berfungsi untuk saya. Masalah saya adalah saya mencoba untuk menghapus catatan sebuah meja besar yang memiliki banyak FK di kaskade jadi saya mendapatkan kesalahan yang sama dengan OP.
Saya menonaktifkan
autocommit
dan kemudian berhasil hanya menambahkanCOMMIT
di akhir kalimat SQL. Sejauh yang saya mengerti ini melepaskan buffer sedikit demi sedikit alih-alih menunggu di akhir perintah.Agar sesuai dengan contoh OP, ini seharusnya bekerja:
mysql> set autocommit=0;
mysql> update customer set account_import_id = 1; commit;
Jangan lupa untuk mengaktifkan
autocommit
kembali jika Anda ingin meninggalkan konfigurasi MySQL seperti sebelumnya.mysql> set autocommit=1;
sumber
Terlambat ke pesta (seperti biasa) namun masalah saya adalah fakta bahwa saya menulis beberapa SQL yang buruk (menjadi pemula) dan beberapa proses memiliki kunci pada catatan (s) <- tidak yakin bertele-tele yang sesuai. Saya akhirnya hanya harus:
SHOW PROCESSLIST
dan kemudian membunuh ID menggunakanKILL <id>
sumber
Hal semacam ini terjadi pada saya ketika saya menggunakan bahasa php exit; di tengah transaksi. Maka transaksi ini "hang" dan Anda harus mematikan proses mysql (dijelaskan di atas dengan daftar proses;)
sumber
Dalam contoh saya, saya menjalankan kueri yang tidak normal untuk memperbaiki data. Jika Anda mengunci tabel dalam kueri Anda, maka Anda tidak perlu berurusan dengan waktu tunggu Kunci:
Ini mungkin bukan ide yang baik untuk penggunaan normal.
Untuk info lebih lanjut, lihat: Manual Referensi MySQL 8.0
sumber
Saya berlari ke ini memiliki 2 koneksi Doktrin DBAL, salah satunya sebagai non-transaksional (untuk log penting), mereka dimaksudkan untuk berjalan paralel tidak tergantung satu sama lain.
Tes integrasi saya dimasukkan ke dalam transaksi untuk pengembalian data setelah pengujian sangat.
Solusi saya adalah menonaktifkan transaksi pembungkus dalam tes-tes itu dan mengatur ulang data db dengan cara lain.
sumber
Mengalami kesalahan yang sama, meskipun saya hanya memperbarui satu tabel dengan satu entri, tetapi setelah me-restart mysql, itu diselesaikan.
sumber