Abfrage:
SELECT COUNT(online.account_id) cnt from online;
Die Online-Tabelle wird jedoch auch durch ein Ereignis geändert, sodass ich die Sperre häufig durch Ausführen sehen kann show processlist
.
Gibt es eine Grammatik in MySQL, die dazu führen kann, dass eine select-Anweisung keine Sperren verursacht?
Und ich habe vergessen zu erwähnen, dass es sich um eine MySQL-Slave-Datenbank handelt.
Nachdem ich in my.cnf:transaction-isolation = READ-UNCOMMITTED
den Slave hinzugefügt habe, wird ein Fehler auftreten:
Fehler 'Binäre Protokollierung nicht möglich. Nachricht: Die Transaktionsebene 'READ-UNCOMMITTED' in InnoDB ist für den Binlog-Modus 'STATEMENT' 'bei Abfrage nicht sicher
Gibt es eine kompatible Möglichkeit, dies zu tun?
Antworten:
Fand einen Artikel mit dem Titel "MYSQL WITH NOLOCK"
https://web.archive.org/web/20100814144042/http://sqldba.org/articles/22-mysql-with-nolock.aspx
In MS SQL Server würden Sie Folgendes tun:
und das MYSQL-Äquivalent ist
BEARBEITEN
Michael Mior schlug Folgendes vor (aus den Kommentaren)
quelle
SESSION
damit die Transaktionsebene nur für die nächste Transaktion gilt. Ersetzen Sie dann einfach die dritte obige Aussage durchCOMMIT
. Dies ist in diesem Fall ein Noop, hat jedoch den Nebeneffekt, dass die Transaktion beendet und auf die Standardisolationsstufe zurückgesetzt wird.SET TRANSACTION
Anweisungsstatus : "Diese Anweisung legt die Transaktionsisolationsstufe fest, die für Operationen an InnoDB-Tabellen verwendet wird."Wenn es sich bei der Tabelle um InnoDB handelt, lesen Sie http://dev.mysql.com/doc/refman/5.1/en/innodb-consistent-read.html. Für SELECTs wird der konsistente Lesemodus (No-Locking-Modus) verwendet Geben Sie FOR UPDATE oder LOCK IN SHARE MODE nicht an, wenn die Option innodb_locks_unsafe_for_binlog festgelegt ist und die Isolationsstufe der Transaktion nicht auf SERIALIZABLE festgelegt ist. Daher werden keine Sperren für Zeilen festgelegt, die aus der ausgewählten Tabelle gelesen werden. "
quelle
Verwenden
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED.
Version 5.0 Docs sind hier .
Version 5.1 Docs sind hier .
quelle
Vielleicht möchten Sie diese Seite des MySQL-Handbuchs lesen . Wie eine Tabelle gesperrt wird, hängt davon ab, um welchen Tabellentyp es sich handelt.
MyISAM verwendet Tabellensperren, um eine sehr hohe Lesegeschwindigkeit zu erreichen. Wenn jedoch eine UPDATE-Anweisung wartet, werden zukünftige SELECTS hinter dem UPDATE in die Warteschlange gestellt.
InnoDB-Tabellen verwenden Sperren auf Zeilenebene, und Sie müssen nicht die gesamte Tabelle hinter einem UPDATE sperren. Es gibt andere Arten von Sperrproblemen, die mit InnoDB verbunden sind, aber Sie werden möglicherweise feststellen, dass es Ihren Anforderungen entspricht.
quelle
Abhängig von Ihrem Tabellentyp funktioniert das Sperren unterschiedlich, aber auch die Anzahl der SELECT. Bei MyISAM-Tabellen sollte eine einfache SELECT count (*) FROM-Tabelle die Tabelle nicht sperren, da sie auf Metadaten zugreift, um die Datensatzanzahl abzurufen. Innodb wird länger dauern, da es die Tabelle in einem Snapshot erfassen muss, um die Datensätze zu zählen, aber es sollte keine Sperrung verursachen.
Sie sollten mindestens concurrent_insert auf 1 gesetzt haben (Standard). Wenn die Datendatei keine "Lücken" für die zu füllende Tabelle enthält, werden Einfügungen an die Datei angehängt, und SELECT und INSERTs können gleichzeitig mit MyISAM-Tabellen erfolgen. Beachten Sie, dass beim Löschen eines Datensatzes eine "Lücke" in der Datendatei entsteht, die versucht, mit zukünftigen Einfügungen und Aktualisierungen gefüllt zu werden.
Wenn Sie Datensätze selten löschen, können Sie concurrent_insert auf 2 setzen. Einfügungen werden immer am Ende der Datendatei hinzugefügt. Dann können Auswahlen und Einfügungen gleichzeitig erfolgen, aber Ihre Datendatei wird niemals kleiner, unabhängig davon, wie viele Datensätze Sie löschen (mit Ausnahme aller Datensätze).
Unter dem Strich sollten Sie, wenn Sie viele Aktualisierungen, Einfügungen und Auswahlen in einer Tabelle haben, diese zu InnoDB machen. Sie können Tabellentypen in einem System jedoch frei mischen.
quelle
Aus dieser Referenz:
quelle
SELECTs führen normalerweise keine Sperren durch, die Sie für InnoDB-Tabellen interessieren. Die Standard-Transaktionsisolationsstufe bedeutet, dass bei Auswahlen keine Inhalte gesperrt werden.
Natürlich kommt es immer noch zu Streitigkeiten.
quelle
show processlist
die Sperren tatsächlich sehen kann. Man kann also davon ausgehen, dass tatsächlich Sperren genommen werden.Eine andere Möglichkeit, das Dirty Read in MySQL zu aktivieren, ist das Hinzufügen eines Hinweises: LOCK IN SHARE MODE
quelle