Voor mij is de documentatie een beetje onduidelijk:
Interne vergrendelingsmethoden suggereert dat het in sommige omstandigheden mogelijk is om in een MyISAM-tabel in te voegen terwijl een andere sessie ervan leest:
Echter, Tabelvergrendelingsproblemen toont een situatie waarin de tafel wordt vergrendeld totdat de SELECT is voltooid (dit past bij uw situatie):
InnoDB-tabel implementeert vergrendelingen op rijniveau, dus alleen de rij die wordt gelezen, wordt vergrendeld in plaats van de hele tabel.
In plaats van alleen op de documentatie te vertrouwen, probeerde ik een kleine test:
- Maak twee tabellen met dezelfde structuur:
table_aentable_b. - Vul
table_amet 500.000 rijen. - Kopieer gegevens van
table_anaartable_bmet behulp van eenINSERT INTO ... SELECTverklaring. - Gebruik tijdens het kopieerproces een andere sessie om een nieuwe rij in te voegen in
table_a. - Controleer of
table_bbevat het nieuwe record.
Wanneer beide tabellen MyISAM, table_b bevatte niet het nieuwe record na de kopie. Wanneer beide tabellen InnoDB waren, table_b bevatte wel het nieuwe record na de kopie. Ik heb dit drie keer herhaald en, zoals verwacht, was het resultaat elke keer hetzelfde.
Kortom, als uw tafel MyISAM is, wordt deze vergrendeld. Als het InnoDB is, zal het niet. Natuurlijk houdt deze test geen rekening met updates, maar ik verwacht dat de resultaten vergelijkbaar zullen zijn.