sql >> Database teknologi >  >> RDS >> PostgreSQL

I PostgreSQL, har flere OPDATERINGER til forskellige rækker i samme tabel en modstridende låse?

UPDATE låser rækken, så du ikke behøver at låse den først. Hvis du prøver at UPDATE overlappende sæt rækker samtidigt, den anden UPDATE vil vente på, at den førstes transaktion begår eller rulle tilbage.

Det store problem med din tilgang - bortset fra det faktum, at UPDATE har ikke en LIMIT klausul - er, at flere arbejdere alle vil forsøge at få fat i de samme rækker. Her er, hvad der sker:

  • arbejder1:Filtrerer tabellen for at finde 200 rækker og låser dem
  • arbejder1:begynder at opdatere rækker
  • arbejder2:filtrerer tabellen for at finde 200 rækker
  • arbejder2:forsøger at begynde at opdatere rækker, men har valgt de samme rækker som arbejder1, så den blokerer på arbejder1s lås
  • arbejder1:Færdiggør opdatering af rækker
  • arbejder2:Efter frigivelse af lås, tjekker WHERE-tilstanden igen og finder ud af, at ingen af ​​rækkerne matcher længere, fordi arbejder1 har opdateret dem. Opdaterer nul rækker.

... og gentag!

Du skal enten:

  • Har en central uddeling af rækker på en ordentlig samtidighedssikker måde; eller
  • Tildel arbejdere ikke-overlappende rækker af id'er at arbejde på

Med hensyn til LIMIT - du kan bruge WHERE id IN (SELECT t.id FROM thetable t LIMIT 200 ORDER BY id) - men du ville have det samme problem med at begge arbejdere vælger det samme sæt rækker at opdatere.



  1. Hvordan kan jeg flette to MySQL-tabeller?

  2. Kolonne 'id', hvor klausulen er tvetydig

  3. Indsætte hele DataTable i databasen på én gang i stedet for række for række?

  4. MySql - langsom afsendelse af datafase