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

Sperrt das die Datenbank?

Für mich ist die Dokumentation etwas unklar:

Interne Sperrmethoden schlägt vor, dass es unter bestimmten Umständen möglich ist, in eine MyISAM-Tabelle einzufügen, während eine andere Sitzung daraus liest:

Allerdings Probleme beim Sperren von Tabellen zeigt eine Situation, in der die Tabelle gesperrt wird, bis das SELECT abgeschlossen ist (das passt zu Ihrer Situation):

InnoDB-Tabellen implementieren Sperren auf Zeilenebene, sodass nur die gelesene Zeile und nicht die gesamte Tabelle gesperrt wird.

Anstatt mich nur auf die Dokumentation zu verlassen, habe ich einen kleinen Test versucht:

  1. Erstellen Sie zwei Tabellen mit derselben Struktur:table_a und table_b .
  2. Füllen Sie table_a aus mit 500.000 Zeilen.
  3. Daten aus table_a kopieren zu table_b mit einem INSERT INTO ... SELECT Aussage.
  4. Verwenden Sie während des Kopiervorgangs eine andere Sitzung, um eine neue Zeile in table_a einzufügen .
  5. Überprüfen Sie, ob table_b enthält den neuen Datensatz.

Wenn beide Tabellen MyISAM enthalten, table_b enthielt den neuen Datensatz nach der Kopie nicht. Wenn beide Tabellen InnoDB waren, table_b enthielt nach der Kopie den neuen Datensatz. Ich habe dies dreimal wiederholt, und wie erwartet war das Ergebnis jedes Mal dasselbe.

Kurz gesagt, wenn Ihre Tabelle MyISAM ist, wird sie gesperrt. Wenn es InnoDB ist, wird es nicht. Natürlich berücksichtigt dieser Test keine Updates, aber ich gehe davon aus, dass die Ergebnisse ähnlich sein werden.