sql >> Database >  >> RDS >> Mysql

Minimaal voorbeeld van het gebruik van select... for update om rijen te isoleren

SELECT ... FOR UPDATE vergrendelt de rij(en) in de exclusieve modus, wat betekent dat de tweede selectie niet kan doorgaan totdat de eerste is voltooid of teruggedraaid. Dit komt omdat het resultaat van de tweede selectie kan worden beïnvloed door de inhoud van de rij die je hebt vergrendeld, dus het moet een leesvergrendeling krijgen voor de rij om te controleren.

Als u een UNIQUE INDEX . aanmaakt op bijvoorbeeld id , je zou kunnen doen;

select * from SolrCoresPreallocated where id=1 for update;

in de eerste transactie en;

select * from SolrCoresPreallocated where id=2 for update;

in de tweede onafhankelijk, aangezien de unieke index de tweede selectie de juiste rij laat vinden zonder de eerste te lezen-vergrendelen.

EDIT:om zo snel mogelijk een "gratis" rij te krijgen, is de enige manier om echt twee transacties te doen;

  • BEGIN/SELECTEER VOOR UPDATE/UPDATE naar bezet/COMMIT om de rij te krijgen.
  • BEGIN//UPDATE om de rij vrij te geven/COMMIT om de rij te verwerken en vrij te geven.

Dit betekent dat je mogelijk compenserende acties nodig hebt in het geval dat een proces mislukt en de transactie terugdraait die de rij zou UPDATEN om vrij te maken, maar aangezien MySQL (of standaard SQL wat dat betreft) geen notie heeft van "haal de volgende ontgrendelde rij ", je hebt niet veel opties.




  1. Hoe maak je een virtuele kolom met MySQL SELECT?

  2. MySql-trigger, update een andere tabel bij invoegen

  3. Hoe zie ik de verschillen tussen 2 MySQL-dumps?

  4. Hoe kan ik de kolommen van twee tabellen samenvoegen tot één uitvoer?