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_a
entable_b
. - Vul
table_a
met 500.000 rijen. - Kopieer gegevens van
table_a
naartable_b
met behulp van eenINSERT INTO ... SELECT
verklaring. - Gebruik tijdens het kopieerproces een andere sessie om een nieuwe rij in te voegen in
table_a
. - Controleer of
table_b
bevat 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.