sql >> Database >  >> RDS >> Mysql

hoe een rij te vergrendelen omdat ze niet worden geselecteerd in een andere transactie

Het klinkt alsof je een vorm van markering nodig hebt om rijen als "in gebruik" te identificeren, zodat de andere instanties niet dezelfde gegevens verwerken; of je een boolean of datumtype gebruikt, is niet relevant, je moet op de een of andere manier de rijen markeren die in gebruik zijn.

U kunt dit doen via een coördinator, een proces of thread met exclusieve toegang tot uw tabel en wiens enige taak het is om rijen te selecteren en deze door te geven aan andere processen om aan te werken. Zelfs dan zal de coördinator moeten weten hoe ver de gegevens zijn, zodat u weer bij hetzelfde probleem zit.

Een andere manier is om een ​​veld te gebruiken om aan te geven dat de rij in gebruik is (zoals je in je vraag hebt gezegd). Elk proces werkt een rij rijen bij met een unieke ID, uitgevoerd in een transactie om de tafel te vergrendelen; Ik zou het verbindingsnummer gebruiken dat is geretourneerd door CONNECTION_ID() om ze te markeren, dan weet je dat het uniek is.

Na de UPDATE ... WHERE connection_id IS NULL (met een toegepaste limiet) transactie is voltooid het proces kan SELECT ... WHERE connection_id = CONNECTION_ID() om hun rijen te krijgen voor verwerking.

Wanneer ze hun werk hebben voltooid, begint de hele cyclus opnieuw om de volgende reeks rijen te markeren totdat ze allemaal zijn verwerkt.




  1. Service Broker configureren voor asynchrone verwerking

  2. Foreign key-beperkingen tijdens het dumpen van gegevens

  3. Snelste manier om afstand tussen twee lat/lange punten te vinden

  4. Ongebruikte primaire sleutels gebruiken