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

Hvordan undgår man løbsforhold, når man bruger find_or_create-metoden i DBIx::Class::ResultSet?

Nej, dokumentationen er forkert. Brug af en transaktion alene ikke undgå dette problem. Det garanterer kun, at hele transaktionen rulles tilbage, hvis der skulle opstå en undtagelse - så ingen inkonsekvent tilstand vil blive ved med at være i databasen.

At undgå dette problem skal du låse bordet - inde i en transaktion, fordi alle låse frigives i slutningen af ​​en transaktion. Noget som:

BEGIN;
LOCK TABLE mytbl IN SHARE MODE;

-- do your find_or_create here

COMMIT;

Men det er ikke en magisk kur mod alt. Det kan blive et præstationsproblem, og der kan være deadlocks (samtidige transaktioner, der gensidigt forsøger at låse ressourcer, som den anden allerede har låst). PostgreSQL vil opdage en sådan tilstand og annullere alle de konkurrerende transaktioner undtagen én. Du skal være forberedt på at prøve handlingen igen ved fejl.

PostgreSQL-manualen om låse.

Hvis du ikke har en masse samtidighed, kan du også bare ignorere problemet. Tidsrummet er meget lille, så det sker kun meget sjældent. Hvis du fanger fejlen med dubletnøglebrud, som ikke vil skade, så har du også dækket dette.



  1. Tjek for databaseforbindelse, ellers vis meddelelsen

  2. Hvad sker der, når kolonnetypen TIMESTAMP ændres til DATETIME i MySQL?

  3. Hent alle nyheder og alle kommentarer

  4. Hvordan øger man den maksimale uploadfilstørrelse for LOAD DATA INFILE-forespørgslen?