Heim Datenbank MySQL-Tutorial innodb next-key lock解析_MySQL

innodb next-key lock解析_MySQL

Jun 01, 2016 pm 01:03 PM
innodb

参考http://blog.csdn.net/zbszhangbosen/article/details/7434637#reply

这里补充一些:

(1)InnoDB默认加锁方式是next-key locking

(2)在聚集索引中,如果主键有唯一性约束(unique,auto increment),next-key locking 会自动降级为record locking。

(3)由于事务的隔离性和一致性要求,会对所有扫描到的record加锁。比如:update ... where/delete .. where/select ...from...lock in share mode/ select .. from .. for update这都是next-key lock。

(4)注意优化器的选择。包括聚集索引和辅助索引,有时会用全表扫描替代索引扫描,这时整张表(聚集索引表)都会被加锁。

record lock:记录锁,也就是仅仅锁着单独的一行

gap lock:区间锁,仅仅锁住一个区间(注意这里的区间都是开区间,也就是不包括边界值,至于为什么这么定义?innodb官方定义的)
next-key lock:record lock+gap lock,所以next-key lock也就半开半闭区间,且是下界开,上界闭。(为什么这么定义?innodb官方定义的)
下面来举个手册上的例子看什么是next-key lock。假如一个索引的行有10,11,13,20
那么可能的next-key lock的包括:
(无穷小, 10]
(10,11]
(11,13]
(13,20]
(20, 无穷大) (这里无穷大为什么不是闭合?你数学不到家~~)
好了现在通过举例子说明:


表test
mysql> show create table test;
+-------+--------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                           |
+-------+--------------------------------------------------------------------------------------------------------+
| test  | CREATE TABLE `test` (
  `a` int(11) NOT NULL,
  PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+--------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select * from test;
+----+
| a  |
+----+
| 11 |
| 12 |
| 13 |
| 14 |
+----+
4 rows in set (0.00 sec)
开始实验:
(一)
session 1:
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)


mysql> delete from test where a=11;
Query OK, 1 row affected (0.00 sec)


session 2:
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into test values(10);
Query OK, 1 row affected (0.00 sec)
mysql> insert into test values(15);
Query OK, 1 row affected (0.00 sec)
mysql> insert into test values(9);
Query OK, 1 row affected (0.00 sec)
mysql> insert into test values(16);
Query OK, 1 row affected (0.01 sec)


mysql> rollback;
Query OK, 0 rows affected (0.00 sec)


ok,上面的情况是预期的,因为a上有索引,那么当然就只要锁定一行,所以其他行的插入不会被阻塞。
那么接下来的情况就有意思了
(二)
session 1(跟上一个session 1相同):
delete from test where a=22;
Query OK, 0 rows affected (0.01 sec)
session 2:
mysql> insert into test values (201);
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> insert into test values (20);
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> insert into test values (19);
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> insert into test values (18);
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> insert into test values (16);
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> insert into test values (9);
Query OK, 1 row affected (0.00 sec)
从上面的结果来看,在a=11后面所有的行,也就是区间(11,无穷大)都被锁定了。先不解释原因,再来看一种情况:
(三)
session 1:
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from test;
+----+
| a  |
+----+
|  7 |
|  9 |
| 10 |
| 12 |
| 13 |
| 14 |
| 15 |
| 22 |
| 23 |
| 24 |
| 25 |
+----+
11 rows in set (0.00 sec)


mysql> delete from test where a=21;
Query OK, 0 rows affected (0.00 sec)
session 2:
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into test values (20);
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> insert into test values (26);
Query OK, 1 row affected (0.00 sec)
mysql> insert into test values (21);
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> insert into test values (16);
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> insert into test values (6);
Query OK, 1 row affected (0.01 sec)
从这里可以看出,现在被锁住的区间就只有[16,21)了。
有了前面对三种类型的加锁解释,现在可以来解释为什么会这样了,在innodb表中 delete from where ..针对扫描到的索引记录加next-key锁(具体的什么语句加什么锁可以查看手册,另外需要说明一下,行锁加锁对象永远是索引记录,因为innodb中表即索引) 。
在(一)中,实际上加的next-key lock就是(11,11] 因此也只有a=11这一条记录被锁住,其他所有插入都没有关系。
在(二)中,因为a=22这条记录不存在,而且22比表里所有的记录值都大,所以在innodb看来锁住的区间就是(14, 无穷大)。所以在插入14以后的值都提示被锁住,而14之前的则可以。
在(三)种,a=21也是不存在,但是在表里面21前后都有记录,因此这里next-key lock的区间也就是(15,21],因此不在这个区间内的都可以插入。
那么为什么next-key lock都是下界开区间,上界闭区间呢?这个倒不重要,管它呢,但是有一点我个人却觉得比较怪,比如说
delete test where a > 11           #------- 1
它的next-key lock是(11, 无穷大) 
delete test where a
它的next-key lock是(无穷小, 10]
这样给人的感觉就很怪,因为在手册上对next-key lock的定义:
Next-key lock: This is a combination of a record lock on the index record and a gap lock on the gapbefore the index record.
而在1那种情况下,如果按照手册上的解释,记录锁和它之前的gap那么就会有些牵强。[今天再次看了一遍官方手册,是之前自己的理解不到位,这个before是对的,因为innodb在加锁时是所有扫描过程中遇到的记录都会被加锁,那么对于1那种情况,实际上是从12开始扫描,但是因为要保证a>11的都被delete掉,因此得一直扫描下去那自然最大值就是无穷大,因为这个next-key lock就是无穷大这条记录(这是假设的一条记录,表示一个边界)加上它之前的gap lock (11, 无穷大),所以在任何时候next-lock都是record lock加上这个record之前的一个gap lock]
但是只要我们自己能理解就行了:记录锁---锁单条记录;区间锁---锁一个开区间;next-key 锁---前面两者的结合,而不要管什么before。
另外next-key lock虽然在很多时候是锁一个区间,但要明白一个区间也可能只有一个元素,因此在称delete from tb where key=x 这种情况下加next-key锁也是完全正确的。
另外还提两点:
1.如果我们的SQL语句里面没有利用到索引,那么加锁对象将是所有行(但不是加表锁),所以建索引是很重要的
2.next-key lock是为防止幻读的发生,而只有repeatable-read以及以上隔离级别才能防止幻读,所以在read-committed隔离级别下面没有next-key lock这一说法。
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
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
1 Monate 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 MySQL das InnoDB-Zeilenformat anhand von Binärinhalten erkennt Wie MySQL das InnoDB-Zeilenformat anhand von Binärinhalten erkennt Jun 03, 2023 am 09:55 AM

InnoDB ist eine Speicher-Engine, die Daten in Tabellen auf der Festplatte speichert, sodass unsere Daten auch nach dem Herunterfahren und Neustarten noch vorhanden sind. Der eigentliche Prozess der Datenverarbeitung findet im Speicher statt, daher müssen die Daten auf der Festplatte in den Speicher geladen werden. Wenn eine Schreib- oder Änderungsanforderung verarbeitet wird, muss auch der Inhalt im Speicher auf der Festplatte aktualisiert werden. Und wir wissen, dass die Geschwindigkeit beim Lesen und Schreiben auf die Festplatte sehr langsam ist, was sich um mehrere Größenordnungen vom Lesen und Schreiben im Speicher unterscheidet. Wenn wir also bestimmte Datensätze aus der Tabelle abrufen möchten, muss die InnoDB-Speicher-Engine lesen die Datensätze einzeln von der Festplatte löschen? Die von InnoDB verwendete Methode besteht darin, die Daten in mehrere Seiten aufzuteilen und Seiten als grundlegende Interaktionseinheit zwischen Festplatte und Speicher zu verwenden. Die Größe einer Seite in InnoDB beträgt im Allgemeinen 16

Was ist MySQL Innodb? Was ist MySQL Innodb? Apr 14, 2023 am 10:19 AM

InnoDB ist eine der Datenbank-Engines von MySQL und einer der Standards für Binärversionen von MySQL AB. Ein zweigleisiges Autorisierungssystem ist die GPL-Autorisierung, das andere ist proprietäre Software Genehmigung. InnoDB ist die bevorzugte Engine für Transaktionsdatenbanken und unterstützt Transaktionssicherheitstabellen (ACID). InnoDB unterstützt Sperren auf Zeilenebene, die die Parallelität weitgehend unterstützen können. Sperren auf Zeilenebene werden von der Speicher-Engine-Ebene implementiert.

Wie man mit einer MySQL-Innodb-Ausnahme umgeht Wie man mit einer MySQL-Innodb-Ausnahme umgeht Apr 17, 2023 pm 09:01 PM

1. Führen Sie einen Rollback durch und installieren Sie MySQL neu. Um die Probleme beim Importieren dieser Daten von anderen Orten zu vermeiden, erstellen Sie zunächst eine Sicherungskopie der Datenbankdatei der aktuellen Bibliothek (/var/lib/mysql/location). Als nächstes deinstallierte ich das Perconaserver5.7-Paket, installierte das ursprüngliche alte 5.1.71-Paket neu, startete den MySQL-Dienst und er meldete Unknown/unsupportedtabletype:innodb und konnte nicht normal gestartet werden. 11050912:04:27InnoDB:Initializingbufferpool,size=384.0M11050912:04:27InnoDB:Complete

So lösen Sie Phantomlesungen in innoDB in MySQL So lösen Sie Phantomlesungen in innoDB in MySQL May 27, 2023 pm 03:34 PM

1. MySQL-Transaktionsisolationsstufe: Bei mehreren Transaktions-Parallelitätskonflikten können einige Probleme wie schmutziges Lesen, nicht wiederholbares Lesen und Phantomlesen auftreten, und innoDB löst sie im wiederholbaren Leseisolationsstufenmodus des Phantom-Lesens, 2. Was ist Phantom-Lesen? Das bedeutet, dass in derselben Transaktion die Ergebnisse, die wir erhalten, wenn wir denselben Bereich vorher und nachher zweimal abfragen, inkonsistent sind, wie in der ersten Transaktion gezeigt Zu diesem Zeitpunkt gibt es nur ein Datenelement, das die Bedingungen erfüllt. In der zweiten Transaktion wird eine Datenzeile eingefügt und bei der ersten Transaktion erneut abgefragt Beachten Sie, dass die ersten und zweiten Abfragen der ersten Transaktion identisch sind

Vergleich der Auswahl der MySQL-Speicher-Engine: Bewertung des InnoDB-, MyISAM- und Speicherleistungsindex Vergleich der Auswahl der MySQL-Speicher-Engine: Bewertung des InnoDB-, MyISAM- und Speicherleistungsindex Jul 26, 2023 am 11:25 AM

Vergleich der Auswahl der MySQL-Speicher-Engine: Bewertung des InnoDB-, MyISAM- und Speicherleistungsindex Einführung: In der MySQL-Datenbank spielt die Wahl der Speicher-Engine eine entscheidende Rolle für die Systemleistung und Datenintegrität. MySQL bietet eine Vielzahl von Speicher-Engines. Zu den am häufigsten verwendeten Engines gehören InnoDB, MyISAM und Memory. In diesem Artikel werden die Leistungsindikatoren dieser drei Speicher-Engines bewertet und anhand von Codebeispielen verglichen. 1. InnoDB-Engine InnoDB ist mein

So verwenden Sie MyISAM- und InnoDB-Speicher-Engines, um die MySQL-Leistung zu optimieren So verwenden Sie MyISAM- und InnoDB-Speicher-Engines, um die MySQL-Leistung zu optimieren May 11, 2023 pm 06:51 PM

MySQL ist ein weit verbreitetes Datenbankverwaltungssystem und verschiedene Speicher-Engines haben unterschiedliche Auswirkungen auf die Datenbankleistung. MyISAM und InnoDB sind die beiden am häufigsten verwendeten Speicher-Engines in MySQL. Sie haben unterschiedliche Eigenschaften und eine unsachgemäße Verwendung kann die Leistung der Datenbank beeinträchtigen. In diesem Artikel wird erläutert, wie Sie diese beiden Speicher-Engines verwenden, um die MySQL-Leistung zu optimieren. 1. MyISAM-Speicher-Engine MyISAM ist die am häufigsten verwendete Speicher-Engine für MySQL. Ihre Vorteile sind hohe Geschwindigkeit und geringer Speicherplatz. MyISA

Tipps und Strategien zur Verbesserung der Leseleistung der MySQL-Speicher-Engine: Vergleichende Analyse von MyISAM und InnoDB Tipps und Strategien zur Verbesserung der Leseleistung der MySQL-Speicher-Engine: Vergleichende Analyse von MyISAM und InnoDB Jul 26, 2023 am 10:01 AM

Tipps und Strategien zur Verbesserung der Leseleistung der MySQL-Speicher-Engine: Vergleichende Analyse von MyISAM und InnoDB Einführung: MySQL ist eines der am häufigsten verwendeten relationalen Open-Source-Datenbankverwaltungssysteme, das hauptsächlich zum Speichern und Verwalten großer Mengen strukturierter Daten verwendet wird. In Anwendungen ist die Leseleistung der Datenbank oft sehr wichtig, da Lesevorgänge in den meisten Anwendungen die Hauptoperationsart darstellen. Dieser Artikel konzentriert sich auf die Verbesserung der Leseleistung der MySQL-Speicher-Engine und konzentriert sich auf eine vergleichende Analyse von MyISAM und InnoDB, zwei häufig verwendeten Speicher-Engines.

MySQL-Speicher-Engine zur Unterstützung von GIS-Daten: räumliche Indexoptimierung in InnoDB MySQL-Speicher-Engine zur Unterstützung von GIS-Daten: räumliche Indexoptimierung in InnoDB Jul 24, 2023 pm 11:07 PM

MySQL-Speicher-Engine zur Unterstützung von GIS-Daten: Räumliche Indexoptimierung in InnoDB Zusammenfassung: In modernen Datenbankanwendungen spielen Daten von geografischen Informationssystemen (GIS) eine immer wichtigere Rolle. Die GIS-Datenverarbeitung ist komplex und dynamisch, und herkömmliche relationale Datenbanken sind nicht gut für die Verarbeitung dieser Art von Daten geeignet. MySQL bietet jedoch eine Speicher-Engine, InnoDB, die die Verarbeitung von GIS-Daten optimieren kann. In diesem Artikel wird erläutert, wie räumliche Indizes auf der InnoDB-Speicher-Engine zur Optimierung von GIS-Daten verwendet werden.

See all articles