Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie kopiert man Daten aus einer anderen Tabelle, ohne die Tabelle in MYSQL 6.2 zu sperren?

Da die Tabellen genau die gleichen Spalten haben, können Sie so etwas tun:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
INSERT INTO NEW_TABLE (SELECT * FROM OLD_TABLE);
COMMIT ;

Ich habe einige zusätzliche Erklärungen hinzugefügt, die auf Wistars basieren Kommentar. Die Leseebenen, die hier verwendet werden können, sind:

  • LESEN VERPFLICHTET :Eine etwas Oracle-ähnliche Isolationsstufe in Bezug auf konsistente (nicht sperrende) Lesevorgänge:Jeder konsistente Lesevorgang, sogar innerhalb derselben Transaktion, setzt und liest seinen eigenen frischen Snapshot
  • UNVERPFLICHTET LESEN :SELECT-Anweisungen werden ohne Sperre ausgeführt, aber möglicherweise wird eine frühere Version einer Zeile verwendet. Daher sind solche Lesevorgänge bei Verwendung dieser Isolationsstufe nicht konsistent. Dies wird auch als Dirty Read bezeichnet. Ansonsten funktioniert diese Isolationsstufe wie READ COMMITTED.
  • WIEDERHOLBARES LESEN :Dies ist die Standardisolationsstufe für InnoDB. Bei konsistenten Lesevorgängen gibt es einen wichtigen Unterschied zur Isolationsstufe READ COMMITTED:Alle konsistenten Lesevorgänge innerhalb derselben Transaktion lesen den Snapshot, der durch den ersten Lesevorgang erstellt wurde. Diese Konvention bedeutet, dass, wenn Sie mehrere einfache (nicht sperrende) SELECT-Anweisungen innerhalb derselben Transaktion absetzen, diese SELECT-Anweisungen auch in Bezug aufeinander konsistent sind.
  • SERIALISIERBAR :Diese Ebene ist wie REPEATABLE READ, aber InnoDB konvertiert implizit alle einfachen SELECT-Anweisungen in SELECT ... LOCK IN SHARE MODE, wenn Autocommit deaktiviert ist. Wenn Autocommit aktiviert ist, ist SELECT eine eigene Transaktion. Es ist daher bekannt, dass es nur gelesen werden kann und serialisiert werden kann, wenn es als konsistentes (nicht sperrendes) Lesen ausgeführt wird, und muss nicht für andere Transaktionen blockiert werden. (Um ein einfaches SELECT zum Blockieren zu zwingen, wenn andere Transaktionen die ausgewählten Zeilen geändert haben, deaktivieren Sie Autocommit.)

Ich hoffe, das hilft.