sql >> Databasteknik >  >> RDS >> Mysql

Mysql välj för uppdatering - det låser inte målraderna. Hur ser jag till att det gör det?

En SELECT FOR UPDATE låser raden du valde för uppdatering tills transaktionen du skapade slutar. Andra transaktioner kan bara läsa den raden men de kan inte uppdatera den så länge transaktionen för att välja för uppdatering fortfarande är öppen.

För att låsa rad(erna):

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

Transaktionen ovan kommer att vara levande och kommer att låsa raden tills den är genomförd.

För att testa det finns det olika sätt. Jag testade det med två terminalinstanser med MySQL-klienten öppen i var och en.

På den first terminal du kör 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 försöka uppdatera raden:

UPDATE test SET parent = 100 WHERE id = 4;

Eftersom du skapar ett val för uppdatering på first terminal frågan ovan kommer att vänta tills transaktionen för att välja för uppdatering har genomförts eller så kommer den att ta slut.

Gå tillbaka till first terminal och genomför transaktionen:

COMMIT;

Kontrollera den second terminal och du kommer att se att uppdateringsfrågan kördes (om den inte tog timeout).




  1. Uppgradering av en varchar-kolumn till enumtyp i postgresql

  2. Vad är standardprecision och skala för ett nummer i Oracle?

  3. MySQL:Hur väljer jag poster för den här veckan?

  4. Hur loggar man in automatiskt i MySQL från ett skalskript?