巧用MySQL InnoDB引擎锁机制解决死锁问题_MySQL
案例如下:
在使用Show innodb status检查引擎状态时,发现了死锁问题:
*** (1) TRANSACTION:
TRANSACTION 0 677833455, ACTIVE 0 sec, process no 11393, OS thread id 278546 starting index read
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 320
MySQL thread id 83, query id 162348740 dcnet03 dcnet Searching rows for update
update TSK_TASK set STATUS_ID=1064,UPDATE_TIME=now () where STATUS_ID=1061 and MON_TIME*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 849384 n bits 208 index `PRIMARY` of table `dcnet_db/TSK_TASK` trx id 0 677833455 lock_mode X locks rec but not gap waiting
Record lock, heap no 92 PHYSICAL RECORD: n_fields 11; compact format; info bits 0
0: len 8; hex 800000000097629c; asc b ;; 1: len 6; hex 00002866eaee; asc (f ;; 2: len 7; hex 00000d40040110; asc @ ;; 3: len 8; hex 80000000000050b2; asc P ;; 4: len 8; hex 800000000000502a; asc P*;; 5: len 8; hex 8000000000005426; asc T&;; 6: len 8; hex 800012412c66d29c; asc A,f ;; 7: len 23; hex 75706c6f6164666972652e636f6d2f6 8616e642e706870; asc xxx.com/;; 8: len 8; hex 800000000000042b; asc +;; 9: len 4; hex 474bfa2b; asc GK +;; 10: len 8; hex 8000000000004e24; asc N$;;
*** (2) TRANSACTION:
TRANSACTION 0 677833454, ACTIVE 0 sec, process no 11397, OS thread id 344086 updating or deleting, thread declared inside InnoDB 499
mysql tables in use 1, locked 1
3 lock struct(s), heap size 320, undo log entries 1
MySQL thread id 84, query id 162348739 dcnet03 dcnet Updating
update TSK_TASK set STATUS_ID=1067,UPDATE_TIME=now () where ID in (9921180)
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 0 page no 849384 n bits 208 index `PRIMARY` of table `dcnet_db/TSK_TASK` trx id 0 677833454 lock_mode X locks rec but not gap
Record lock, heap no 92 PHYSICAL RECORD: n_fields 11; compact format; info bits 0
0: len 8; hex 800000000097629c; asc b ;; 1: len 6; hex 00002866eaee; asc (f ;; 2: len 7; hex 00000d40040110; asc @ ;; 3: len 8; hex 80000000000050b2; asc P ;; 4: len 8; hex 800000000000502a; asc P*;; 5: len 8; hex 8000000000005426; asc T&;; 6: len 8; hex 800012412c66d29c; asc A,f ;; 7: len 23; hex 75706c6f6164666972652e636f6d2f6 8616e642e706870; asc uploadfire.com/hand.php;; 8: len 8; hex 800000000000042b; asc +;; 9: len 4; hex 474bfa2b; asc GK +;; 10: len 8; hex 8000000000004e24; asc N$;;
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 843102 n bits 600 index `KEY_TSKTASK_MONTIME2` of table `dcnet_db/TSK_TASK` trx id 0 677833454 lock_mode X locks rec but not gap waiting
Record lock, heap no 395 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
0: len 8; hex 8000000000000425; asc %;; 1: len 8; hex 800012412c66d29c; asc A,f ;; 2: len 8; hex 800000000097629c; asc b ;;
*** WE ROLL BACK TRANSACTION (1)
此死锁问题涉及TSK_TASK表,该表用于保存系统监测任务,以下是相关字段及索引:
ID:主键;
MON_TIME:监测时间;
STATUS_ID:任务状态;
索引:KEY_TSKTASK_MONTIME2 (STATUS_ID, MON_TIME)。
分析,涉及的两条语句应该不会涉及相同的TSK_TASK记录,那为什么会造成死锁呢?
查询MySQL官网文档,发现这跟MySQL的索引机制有关。MySQL的InnoDB引擎是行级锁,我原来的理解是直接对记录进行锁定,实际上并不是这样的。
要点如下:
不是对记录进行锁定,而是对索引进行锁定;
在UPDATE、DELETE操作时,MySQL不仅锁定WHERE条件扫描过的所有索引记录,而且会锁定相邻的键值,即所谓的next-key locking;
如语句UPDATE TSK_TASK SET UPDATE_TIME = NOW() WHERE ID > 10000会锁定所有主键大于等于1000的所有记录,在该语句完成之前,你就不能对主键等于10000的记录进行操作;
当非簇索引(non-cluster index)记录被锁定时,相关的簇索引(cluster index)记录也需要被锁定才能完成相应的操作。
再分析一下发生问题的两条SQL语句,就不难找到问题所在了:
当“update TSK_TASK set STATUS_ID=1064,UPDATE_TIME=now () where STATUS_ID=1061 and MON_TIME
假设“update TSK_TASK set STATUS_ID=1067,UPDATE_TIME=now () where ID in (9921180)”几乎同时执行时,本语句首先锁定簇索引(主键),由于需要更新STATUS_ID的值,所以还需要锁定KEY_TSKTASK_MONTIME2的某些索引记录。
这样第一条语句锁定了KEY_TSKTASK_MONTIME2的记录,等待主键索引,而第二条语句则锁定了主键索引记录,而等待KEY_TSKTASK_MONTIME2的记录,在此情况下,死锁就产生了。
笔者通过拆分第一条语句解决死锁问题:
先查出符合条件的ID:select ID from TSK_TASK where STATUS_ID=1061 and MON_TIME
至此,死锁问题彻底解决

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Program yang dilaksanakan dipanggil proses. Proses boleh menjadi aplikasi yang berjalan pada sistem pengendalian semasa atau aplikasi yang berkaitan dengan sistem pengendalian. Jika aplikasi terikat pada sistem pengendalian, ia mula-mula mencipta proses untuk melaksanakan sendiri. Aplikasi lain bergantung pada perkhidmatan sistem pengendalian untuk pelaksanaan. Kebanyakan aplikasi adalah perkhidmatan sistem pengendalian dan aplikasi latar belakang yang mengekalkan sistem pengendalian, perisian dan perkakasan. Dalam python kita mempunyai kaedah yang berbeza untuk menyemak sama ada aplikasi dibuka atau tidak. Mari belajar tentang mereka secara terperinci satu demi satu. Menggunakan fungsi psutil.process_iter() psutil ialah modul dalam Python yang menyediakan pengguna antara muka untuk mendapatkan maklumat tentang proses yang sedang berjalan dan penggunaan sistem.

Objek boleh lelar ialah objek yang semua elemennya boleh diulang menggunakan gelung atau fungsi boleh lelar. Senarai, rentetan, kamus, tupel, dsb. semuanya dipanggil objek boleh lelar. Dalam bahasa Python, terdapat pelbagai cara untuk menyemak sama ada sesuatu objek boleh lelaran. Mari kita lihat satu persatu. Menggunakan Gelung Dalam Python, kita mempunyai dua teknik gelung, satu menggunakan gelung "untuk" dan satu lagi menggunakan gelung "semasa". Menggunakan salah satu daripada dua gelung ini, kita boleh menyemak sama ada objek yang diberikan boleh lelaran. Contoh Dalam contoh ini, kami akan cuba melelarkan objek menggunakan gelung "untuk" dan menyemak sama ada ia diulang atau tidak. Di bawah ialah kod. l=["epal",22,"orang
![Semak ejaan tidak berfungsi dalam Pasukan [Tetap]](https://img.php.cn/upload/article/000/887/227/170968741326618.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
Kami telah mula menyedari bahawa kadangkala semakan ejaan berhenti berfungsi untuk Pasukan. Semakan ejaan ialah alat penting untuk komunikasi yang berkesan, dan sebarang serangan ke atasnya boleh menyebabkan gangguan yang besar kepada aliran kerja. Dalam artikel ini, kami akan meneroka sebab biasa mengapa semakan ejaan mungkin tidak berfungsi seperti yang diharapkan dan cara memulihkannya kepada keadaan sebelumnya. Jadi, jika semakan ejaan tidak berfungsi dalam Pasukan, ikuti penyelesaian yang dinyatakan dalam artikel ini. Mengapa semakan ejaan Microsoft tidak berfungsi? Mungkin terdapat beberapa sebab mengapa semakan ejaan Microsoft tidak berfungsi dengan betul. Sebab ini termasuk tetapan bahasa yang tidak serasi, fungsi semakan ejaan yang dilumpuhkan, pemasangan MSTeam atau MSOffice yang rosak, dsb. Juga, MSTeams dan MSOf yang ketinggalan zaman

Bagaimana untuk menyemak status kesihatan SSD dalam Windows 11? Untuk kelajuan membaca, menulis dan mengakses yang pantas, SSD menggantikan HDD dengan pantas, tetapi walaupun ia lebih dipercayai, anda masih perlu menyemak kesihatan SSD anda dalam Windows 11. Bagaimana untuk mengendalikannya? Dalam tutorial ini, editor akan berkongsi dengan anda kaedah tersebut. Kaedah 1: Gunakan WMIC1, gunakan kombinasi kekunci Win+R, taip wmic, dan kemudian tekan atau klik OK. Masukkan2. Sekarang, taip atau tampal arahan berikut untuk menyemak status kesihatan SSD: diskdrivegetstatus Jika anda menerima mesej "Status: OK", pemacu SSD anda beroperasi seperti biasa.

Telefon mudah alih Apple ialah telefon mudah alih yang paling banyak dipilih oleh orang baru-baru ini, tetapi kita sering melihat orang membincangkan perbezaan antara telefon bimbit Apple yang dikunci dan tidak dikunci dalam talian, dan mereka terjerat dalam mana satu untuk dibeli. Hari ini, Chen Siqi akan berkongsi dengan anda perbezaan antara iPhone terkunci dan tidak berkunci serta membantu anda menyelesaikan masalah. Malah, tidak banyak perbezaan antara kedua-duanya dari segi penampilan dan fungsi. Apakah versi terkunci dan versi tidak berkunci? iPhone tanpa sekatan mengunci bermakna ia tidak dihadkan oleh pengendali, dan kad SIM mana-mana pengendali boleh digunakan secara normal. Versi terkunci bermakna ia mempunyai kunci rangkaian dan hanya boleh menggunakan kad SIM yang disediakan oleh pengendali yang ditetapkan dan tidak boleh menggunakan orang lain. Malah, telefon Apple yang tidak berkunci boleh menggunakan mudah alih,

Bagaimana untuk menyemak sama ada rentetan bermula dengan aksara tertentu dalam Golang? Apabila pengaturcaraan di Golang, anda sering menghadapi situasi di mana anda perlu menyemak sama ada rentetan bermula dengan aksara tertentu. Untuk memenuhi keperluan ini, kita boleh menggunakan fungsi yang disediakan oleh pakej rentetan di Golang untuk mencapainya. Seterusnya, kami akan memperkenalkan secara terperinci cara menggunakan Golang untuk menyemak sama ada rentetan bermula dengan aksara tertentu, dengan contoh kod tertentu. Di Golang, kita boleh menggunakan HasPrefix daripada pakej rentetan

Anda boleh menggunakan kaedah contains() antara muka Senarai untuk menyemak sama ada objek wujud dalam senarai. contains() method booleancontains(Objecto) Mengembalikan benar jika senarai ini mengandungi elemen yang ditentukan. Secara lebih formal, mengembalikan benar jika dan hanya jika senarai ini mengandungi sekurang-kurangnya satu elemen e sedemikian (o==null?e==null:o.equals(e)). Parameter c - elemen yang kehadirannya dalam senarai ini akan diuji. Nilai Pulangan Mengembalikan benar jika senarai ini mengandungi elemen yang ditentukan. Membuang ClassCastException - jika jenis elemen yang ditentukan tidak serasi dengan senarai ini (pilihan). NullP

Tajuk: Bagaimana untuk menggunakan Oracle untuk bertanya sama ada jadual dikunci? Dalam pangkalan data Oracle, kunci jadual bermaksud bahawa apabila transaksi menjalankan operasi tulis pada jadual, transaksi lain akan disekat apabila mereka ingin melakukan operasi tulis pada jadual atau membuat perubahan struktur pada jadual (seperti menambah lajur, memadam baris , dan lain-lain.). Dalam proses pembangunan sebenar, kita sering perlu bertanya sama ada jadual dikunci untuk menyelesaikan masalah dan menangani masalah berkaitan dengan lebih baik. Artikel ini akan memperkenalkan cara menggunakan pernyataan Oracle untuk bertanya sama ada jadual dikunci dan memberikan contoh kod tertentu. Untuk memeriksa sama ada meja dikunci, kita
