sql >> Database >  >> RDS >> Mysql

vergrendelt dit de database?

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:

  1. Maak twee tabellen met dezelfde structuur:table_a en table_b .
  2. Vul table_a met 500.000 rijen.
  3. Kopieer gegevens van table_a naar table_b met behulp van een INSERT INTO ... SELECT verklaring.
  4. Gebruik tijdens het kopieerproces een andere sessie om een ​​nieuwe rij in te voegen in table_a .
  5. 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.




  1. Wat vertelt PostgreSQL mij precies?

  2. De meest efficiënte T-SQL-manier om een ​​varchar aan de linkerkant tot een bepaalde lengte op te vullen?

  3. Standaardlocatie van PostgreSQL-database op Linux

  4. Doctrine - Hoe de echte sql uit te printen, niet alleen de voorbereide verklaring?