Heim Datenbank MySQL-Tutorial 巧用MySQL InnoDB引擎锁机制解决死锁问题_MySQL

巧用MySQL InnoDB引擎锁机制解决死锁问题_MySQL

Jun 01, 2016 pm 02:00 PM
检查

案例如下:

在使用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

至此,死锁问题彻底解决

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie überprüfe ich, ob die Anwendung in Python geöffnet ist? Wie überprüfe ich, ob die Anwendung in Python geöffnet ist? Aug 26, 2023 pm 06:49 PM

Das ausgeführte Programm wird als Prozess bezeichnet. Ein Prozess kann eine Anwendung sein, die auf dem aktuellen Betriebssystem ausgeführt wird, oder eine Anwendung, die mit dem Betriebssystem zusammenhängt. Wenn eine Anwendung an das Betriebssystem gebunden ist, erstellt sie zunächst einen Prozess, um sich selbst auszuführen. Andere Anwendungen sind zur Ausführung auf Betriebssystemdienste angewiesen. Bei den meisten Anwendungen handelt es sich um Betriebssystemdienste und Hintergrundanwendungen, die das Betriebssystem, die Software und die Hardware warten. In Python gibt es verschiedene Methoden, um zu überprüfen, ob die Anwendung geöffnet ist oder nicht. Lassen Sie uns sie einzeln im Detail kennenlernen. Verwenden der Funktion psutil.process_iter() psutil ist ein Modul in Python, das Benutzern eine Schnittstelle zum Abrufen von Informationen über laufende Prozesse und Systemauslastung bietet.

Wie überprüfe ich, ob ein Objekt in Python iterierbar ist? Wie überprüfe ich, ob ein Objekt in Python iterierbar ist? Aug 25, 2023 pm 10:05 PM

Ein iterierbares Objekt ist ein Objekt, über dessen alle Elemente mithilfe einer Schleife oder einer iterierbaren Funktion iteriert werden kann. Listen, Zeichenfolgen, Wörterbücher, Tupel usw. werden alle als iterierbare Objekte bezeichnet. In der Python-Sprache gibt es verschiedene Möglichkeiten zu überprüfen, ob ein Objekt iterierbar ist. Schauen wir uns das einzeln an. Verwenden von Schleifen In Python gibt es zwei Schleifentechniken: Eine verwendet die „for“-Schleife und die andere die „while“-Schleife. Mithilfe einer dieser beiden Schleifen können wir prüfen, ob ein bestimmtes Objekt iterierbar ist. Beispiel In diesem Beispiel versuchen wir, ein Objekt mithilfe einer „for“-Schleife zu iterieren und prüfen, ob es iteriert wird oder nicht. Unten ist der Code. l=["apple",22,"orang

Rechtschreibprüfung funktioniert in Teams nicht [Behoben] Rechtschreibprüfung funktioniert in Teams nicht [Behoben] Mar 06, 2024 am 09:10 AM

Uns ist aufgefallen, dass die Rechtschreibprüfung für Teams manchmal nicht mehr funktioniert. Die Rechtschreibprüfung ist ein wesentliches Werkzeug für eine effektive Kommunikation, und jeder Angriff darauf kann zu erheblichen Störungen des Arbeitsablaufs führen. In diesem Artikel untersuchen wir häufige Gründe, warum die Rechtschreibprüfung möglicherweise nicht wie erwartet funktioniert, und wie Sie sie in den vorherigen Zustand zurückversetzen können. Wenn die Rechtschreibprüfung in Teams nicht funktioniert, befolgen Sie die in diesem Artikel genannten Lösungen. Warum funktioniert die Rechtschreibprüfung von Microsoft nicht? Es kann mehrere Gründe dafür geben, dass die Rechtschreibprüfung von Microsoft nicht ordnungsgemäß funktioniert. Zu diesen Gründen gehören inkompatible Spracheinstellungen, deaktivierte Rechtschreibprüfung, beschädigte MSTeam- oder MSOffice-Installation usw. Außerdem veraltete MSTeams und MSOf

Wie überprüfe ich den SSD-Gesundheitsstatus in Windows 11? So überprüfen Sie den SSD-Gesundheitsstatus unter Win11 Wie überprüfe ich den SSD-Gesundheitsstatus in Windows 11? So überprüfen Sie den SSD-Gesundheitsstatus unter Win11 Feb 14, 2024 pm 08:21 PM

Wie überprüfe ich den SSD-Gesundheitsstatus in Windows 11? Aufgrund ihrer hohen Lese-, Schreib- und Zugriffsgeschwindigkeit ersetzen SSDs schnell Festplatten. Obwohl sie zuverlässiger sind, müssen Sie dennoch den Zustand Ihrer SSDs in Windows 11 überprüfen. Wie bedient man es? In diesem Tutorial stellt Ihnen der Herausgeber die Methode vor. Methode 1: Verwenden Sie WMIC1, verwenden Sie die Tastenkombination Win+R, geben Sie wmic ein und drücken oder klicken Sie dann auf OK. Geben Sie 2 ein. Geben Sie nun den folgenden Befehl ein oder fügen Sie ihn ein, um den SSD-Gesundheitsstatus zu überprüfen: diskdrivegetstatus Wenn Sie die Meldung „Status: OK“ erhalten, funktioniert Ihr SSD-Laufwerk normal.

Was ist der Unterschied zwischen gesperrten und entsperrten iPhones? Ausführliche Einführung: Vergleich der Unterschiede zwischen gesperrten und entsperrten iPhones Was ist der Unterschied zwischen gesperrten und entsperrten iPhones? Ausführliche Einführung: Vergleich der Unterschiede zwischen gesperrten und entsperrten iPhones Mar 28, 2024 pm 03:10 PM

Apple-Handys sind in letzter Zeit das von den Menschen am häufigsten gewählte Mobiltelefon, aber wir sehen oft, dass Leute online über den Unterschied zwischen gesperrten und entsperrten Apple-Handys diskutieren und sich nicht sicher sind, welches sie kaufen sollen. Heute verrät Ihnen Chen Siqi den Unterschied zwischen gesperrten und entsperrten iPhones und hilft Ihnen bei der Lösung von Problemen. Tatsächlich gibt es zwischen den beiden keinen großen Unterschied in Aussehen und Funktion. Der Schlüssel liegt im Preis und in der Verwendung. Was ist eine gesperrte Version und eine entsperrte Version? Ein iPhone ohne Sperrbeschränkungen bedeutet, dass es nicht durch den Betreiber eingeschränkt wird und die SIM-Karte jedes Betreibers normal verwendet werden kann. Eine gesperrte Version bedeutet, dass sie über eine Netzwerksperre verfügt und nur die vom angegebenen Betreiber bereitgestellte SIM-Karte und keine anderen verwenden kann. Tatsächlich können entsperrte Apple-Telefone mobile,

Wie kann man in Golang überprüfen, ob eine Zeichenfolge mit einem bestimmten Zeichen beginnt? Wie kann man in Golang überprüfen, ob eine Zeichenfolge mit einem bestimmten Zeichen beginnt? Mar 12, 2024 pm 09:42 PM

Wie kann man in Golang überprüfen, ob eine Zeichenfolge mit einem bestimmten Zeichen beginnt? Beim Programmieren in Golang kommt es häufig vor, dass Sie prüfen müssen, ob eine Zeichenfolge mit einem bestimmten Zeichen beginnt. Um diese Anforderung zu erfüllen, können wir die vom Strings-Paket in Golang bereitgestellten Funktionen verwenden, um dies zu erreichen. Als Nächstes stellen wir anhand spezifischer Codebeispiele ausführlich vor, wie Sie mit Golang überprüfen können, ob eine Zeichenfolge mit einem bestimmten Zeichen beginnt. In Golang können wir HasPrefix aus dem Strings-Paket verwenden

Wie überprüfe ich, ob ArrayList ein bestimmtes Element in Java enthält? Wie überprüfe ich, ob ArrayList ein bestimmtes Element in Java enthält? Sep 03, 2023 pm 04:09 PM

Mit der Methode „contains()“ der Schnittstelle „List“ können Sie prüfen, ob ein Objekt in der Liste vorhanden ist. enthält()-Methode booleancontains(Objecto) Gibt „true“ zurück, wenn diese Liste das angegebene Element enthält. Formeller ausgedrückt: Gibt genau dann „true“ zurück, wenn diese Liste mindestens ein Element e enthält, sodass (o==null?e==null:o.equals(e)). Parameter c – das Element, dessen Anwesenheit in dieser Liste getestet werden soll. Rückgabewert Gibt „true“ zurück, wenn diese Liste das angegebene Element enthält. Löst eine ClassCastException aus – wenn der Typ des angegebenen Elements mit dieser Liste nicht kompatibel ist (optional). NullP

Wie frage ich mit Oracle ab, ob eine Tabelle gesperrt ist? Wie frage ich mit Oracle ab, ob eine Tabelle gesperrt ist? Mar 06, 2024 am 11:54 AM

Titel: Wie kann ich mit Oracle abfragen, ob eine Tabelle gesperrt ist? In der Oracle-Datenbank bedeutet Tabellensperre, dass, wenn eine Transaktion einen Schreibvorgang für die Tabelle ausführt, andere Transaktionen blockiert werden, wenn sie Schreibvorgänge für die Tabelle ausführen oder strukturelle Änderungen an der Tabelle vornehmen möchten (z. B. Spalten hinzufügen, Zeilen löschen). , usw.). Im eigentlichen Entwicklungsprozess müssen wir häufig abfragen, ob die Tabelle gesperrt ist, um damit verbundene Probleme besser beheben und beheben zu können. In diesem Artikel wird erläutert, wie Sie mithilfe von Oracle-Anweisungen abfragen, ob eine Tabelle gesperrt ist, und es werden spezifische Codebeispiele aufgeführt. Um zu überprüfen, ob der Tisch gesperrt ist, haben wir

See all articles