sql >> Database >  >> RDS >> Mysql

Mysql selecteren voor update - het vergrendelt de doelrijen niet. Hoe zorg ik ervoor dat dit het geval is?

EEN SELECT FOR UPDATE vergrendelt de rij die u hebt geselecteerd voor update totdat de transactie die u hebt gemaakt, eindigt. Andere transacties kunnen die rij alleen lezen, maar ze kunnen deze niet bijwerken zolang de transactie selecteren voor update nog open is.

Om de rij(en) te vergrendelen:

START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Run whatever logic you want to do
COMMIT;

De bovenstaande transactie blijft actief en vergrendelt de rij totdat deze is vastgelegd.

Om het te testen, zijn er verschillende manieren. Ik heb het getest met behulp van twee terminalinstanties met de MySQL-client in elk geopend.

Op de first terminal u voert de SQL uit:

START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Do not COMMIT to keep the transaction alive

Op de second terminal je kunt proberen de rij bij te werken:

UPDATE test SET parent = 100 WHERE id = 4;

Aangezien u een selectie voor update maakt op de first terminal de bovenstaande query wacht totdat de transactie selecteren voor update is vastgelegd of er een time-out optreedt.

Ga terug naar de first terminal en voer de transactie uit:

COMMIT;

Controleer de second terminal en je zult zien dat de update-query is uitgevoerd (als er geen time-out is opgetreden).




  1. SQL Oracle LEFT JOIN en SUBQUERY-fout:ORA-00905:ontbrekend trefwoord

  2. SQL Selecteer uit 2 tabellen met dezelfde kolomnamen, retourneer alleen kolom wanneer niet null

  3. Linker join of selecteer uit meerdere tabellen met komma (,)

  4. Hoe dubbele records uit mijn tabel te voorkomen Negeren invoegen werkt hier niet