sql >> Databasteknik >  >> RDS >> PostgreSQL

I PostgreSQL, har flera UPPDATERINGAR till olika rader i samma tabell motstridiga lås?

UPDATE låser raden, så du behöver inte låsa den först. Om du försöker UPDATE överlappande uppsättningar rader samtidigt, den andra UPDATE väntar på att den förstas transaktion genomförs eller återställs.

Det stora problemet med ditt tillvägagångssätt - förutom det faktum att UPDATE har ingen LIMIT klausul - är att flera arbetare alla kommer att försöka ta samma rader. Så här händer:

  • arbetare1:Filtrerar tabellen för att hitta 200 rader och låser dem
  • arbetare1:börjar uppdatera rader
  • arbetare2:filtrerar tabellen för att hitta 200 rader
  • arbetare2:försöker börja uppdatera rader, men har valt samma rader som arbetare1 så det blockerar arbetar1s lås
  • arbetare1:Avslutar uppdateringen av rader
  • arbetare2:Efter att låset släppts, kontrollerar WHERE-villkoret igen och upptäcker att ingen av raderna matchar längre eftersom arbetare1 har uppdaterat dem. Uppdaterar noll rader.

... och upprepa!

Du måste antingen:

  • Ha en central dela ut rader på ett korrekt samtidighetssäkert sätt; eller
  • Tilldela arbetare icke-överlappande intervall av ID att arbeta på

När det gäller LIMIT - du kan använda WHERE id IN (SELECT t.id FROM thetable t LIMIT 200 ORDER BY id) - men du skulle ha samma problem med att båda arbetarna väljer samma uppsättning rader att uppdatera.



  1. Hur man ersätter alla förekomster av en sträng med en annan sträng i SQL Server – REPLACE()

  2. Salesforce TLS 1.0 Utfasning

  3. PostgreSQL installationer med hög tillgänglighet Patroni

  4. Ändra kommando i Aurora DB (lägg till en ny kolumn)