sql >> Databasteknik >  >> RDS >> Mysql

MySQL Select... för uppdatering med index har samtidighetsproblem

Rent teoretiskt ser det ut som att du inte låser de rätta raderna (annat skick i den första satsen än i uppdateringssatsen; dessutom låser du bara en rad på grund av LIMIT 1 , medan du eventuellt uppdaterar fler rader senare).

Prova detta:

START TRANSACTION;
SELECT v_id FROM v_ext WHERE username IS NULL AND v_id=yyy FOR UPDATE;
UPDATE v_ext SET username=xxx WHERE v_id=yyy;
COMMIT;

[redigera]

När det gäller orsaken till ditt dödläge är detta det troliga svaret (från manualen ):

Utan ett index visas SELECT ... FOR UPDATE uttalandet kommer sannolikt att låsa hela tabellen, medan det med ett index bara låser vissa rader. Eftersom du inte låste rätt rader i den första satsen, förvärvas ytterligare ett lås under den andra satsen.

Uppenbarligen kan ett dödläge inte inträffa om hela bordet är låst (dvs utan ett index). Ett dödläge kan säkert uppstå i den andra installationen.



  1. korrekt vilolägeskommentar för byte[]

  2. Är det möjligt att stänga av offertbehandling i Postgres COPY-kommandot med CSV-format?

  3. IRI produktnomenklatur och arkitektur

  4. PostgreSQL-index används inte för fråga om IP-intervall