sql >> Database teknologi >  >> RDS >> Mysql

hvordan man låser en række, da de ikke vælges i anden transaktion

Det lyder som om du har brug for en form for markør for at identificere rækker som "i brug", så de andre forekomster ikke behandler de samme data; om du bruger en boolsk eller datotype er irrelevant, på en eller anden måde skal du markere rækkerne i brug.

Du kan enten gøre dette via en dispatcher, en proces eller tråd med eneadgang til din tabel, og hvis eneste opgave er at vælge rækker og videregive dem til andre processer at arbejde på. Selv da skal afsenderen vide, hvor langt gennem dataene de har nået, så du er tilbage til det samme problem.

En anden måde er at bruge et felt til at angive, at rækken er i brug (som du har sagt i dit spørgsmål). Hver proces opdaterer en blok af rækker med et unikt ID, udført inde i en transaktion for at låse tabellen; Jeg ville bruge forbindelsesnummeret returneret fra CONNECTION_ID() for at markere dem, så ved du, at det er unikt.

Efter UPDATE ... WHERE connection_id IS NULL (med en grænse anvendt) transaktionen er fuldført processen kan SELECT ... WHERE connection_id = CONNECTION_ID() for at få deres rækker til behandling.

Når de har afsluttet deres arbejde, starter hele cyklussen igen for at markere det næste sæt rækker, indtil alle er blevet behandlet.




  1. Brug af LAST_INSERT_ID() i en indsættelse med flere rækker

  2. Hvordan bestiller man efter en bestemt del af en streng?

  3. hvordan man dropper databasen

  4. Hvordan man kombinerer resultater af to forespørgsler i et enkelt datasæt