sql >> Databasteknik >  >> RDS >> Mysql

hur man låser en rad eftersom de inte väljs i andra transaktioner

Det låter som om du behöver någon form av markör för att identifiera rader som "används" så att de andra instanserna inte behandlar samma data; om du använder en boolesk eller datumtyp är irrelevant, på något sätt måste du markera raderna som används.

Du kan antingen göra detta via en avsändare, en process eller tråd med ensam tillgång till din tabell och vems enda jobb är att välja rader och skicka dem till andra processer att arbeta på. Även då måste avsändaren veta hur långt genom data de har så att du är tillbaka till samma problem.

Ett annat sätt är att använda ett fält för att indikera att raden används (som du sa i din fråga). Varje process uppdaterar ett block av rader med ett unikt ID, utfört i en transaktion för att låsa tabellen; Jag skulle använda anslutningsnumret som returneras från CONNECTION_ID() för att markera dem, då vet du att det är unikt.

Efter UPDATE ... WHERE connection_id IS NULL (med en gräns tillämpad) transaktionen är klar, processen kan SELECT ... WHERE connection_id = CONNECTION_ID() för att hämta sina rader för bearbetning.

När de har slutfört sitt arbete börjar hela cykeln igen för att markera nästa uppsättning rader tills alla har bearbetats.




  1. beräkna löpande saldo i Oracle-fråga

  2. Självgodhet leder till:Risk blir verklighet

  3. hur man ansluter till databas på en annan server

  4. Hur man installerar MySQL 8 på Ubuntu