sql >> Database teknologi >  >> RDS >> Mysql

Mysql vælg til opdatering - det låser ikke målrækkerne. Hvordan sikrer jeg mig, at det gør det?

En SELECT FOR UPDATE låser den række, du valgte til opdatering, indtil den transaktion, du oprettede, slutter. Andre transaktioner kan kun læse den række, men de kan ikke opdatere den, så længe transaktionen for at vælge til opdatering stadig er åben.

For at låse rækken/rækkerne:

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

Transaktionen ovenfor vil være i live og vil låse rækken, indtil den er begået.

For at teste det er der forskellige måder. Jeg testede det ved at bruge to terminalforekomster med MySQL-klienten åbnet i hver.

På den first terminal du kører SQL:

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

På den second terminal du kan prøve at opdatere rækken:

UPDATE test SET parent = 100 WHERE id = 4;

Da du opretter et valg til opdatering på first terminal forespørgslen ovenfor vil vente, indtil transaktionen for valg til opdatering er begået, eller den vil timeout.

Gå tilbage til first terminal og begå transaktionen:

COMMIT;

Tjek den second terminal og du vil se, at opdateringsforespørgslen blev udført (hvis den ikke fik timeout).




  1. MySQL-lagrede procedurer bruger dem eller ikke til at bruge dem

  2. mysql vælg forespørgsel hvor dato =... returnerer ikke data

  3. Få id'et for den sidste indsatte post i mybatis

  4. MySQL Opdater flere rækker i en enkelt kolonne baseret på værdier fra den samme kolonne