sql >> Database >  >> RDS >> Mysql

MySQL Select... voor update met index heeft een gelijktijdigheidsprobleem

Puur theoretisch gezien lijkt het alsof je niet de juiste rijen vergrendelt (andere voorwaarde in de eerste instructie dan in de update-instructie; bovendien vergrendel je maar één rij vanwege LIMIT 1 , terwijl u mogelijk later meer rijen bijwerkt).

Probeer dit:

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;

[bewerken]

Wat betreft de reden voor je impasse, dit is het waarschijnlijke antwoord (uit de handleiding ):

Zonder index, de SELECT ... FOR UPDATE statement zal waarschijnlijk de hele tabel vergrendelen, terwijl het bij een index slechts enkele rijen vergrendelt. Omdat je niet de juiste rijen in de eerste instructie hebt vergrendeld, wordt een extra vergrendeling verkregen tijdens de tweede instructie.

Het is duidelijk dat een deadlock niet kan optreden als de hele tafel is vergrendeld (d.w.z. zonder een index). Een deadlock kan zeker optreden in de tweede setup.



  1. EF en TransactionScope voor zowel SQL Server als Oracle zonder te escaleren/overspannen naar DTC?

  2. MySQL naar MS Access

  3. Is een SQL-injectie eigenlijk wel mogelijk door een tweede query toe te voegen?

  4. SQL:tel alle records met opeenvolgend optreden van dezelfde waarde voor elke apparaatset en retourneer het hoogste aantal