sql >> Database teknologi >  >> RDS >> Oracle

Race tilstand mellem valg og opdatering

Jeg går ud fra, at din UPDATE sætningen selv bekræfter lastmodified værdi, som du læser i din SELECT udtalelse som nisided antyder.

Hvis lastmodified er en DATE , så er der en potentiel løbstilstand, hvis der er flere opdateringer til den samme række i samme sekund siden en DATE har kun granularitet til den anden. Hvis lastmodified er et TIMESTAMP , på den anden side er vinduet, hvori løbstilstanden kan forekomme, meget mere begrænset, da en TIMESTAMP vil have mellem 3 og 9 cifre med sub-sekunds præcision (3 på de fleste Windows-maskiner, 6 på de fleste Unix-maskiner). Det er ret usandsynligt, men ikke umuligt, at du vil have to opdateringer på det samme millisekund eller endda det samme mikrosekund. Men det er ikke ufejlbarligt.

Du kan bruge en sekvensgenereret værdi i stedet for en sidste ændringsdato. Det kan garantere, at du ikke mister en opdatering, da en NOCYCLE-sekvens ikke returnerer den samme værdi to gange. Men hvis du går ned ad den vej, mister du enten informationsfordelen ved at have en sidste opdateringsdato på hver række, eller du gemmer et par ekstra bytes data i hver række i tabellen. En af disse afvejninger kan være det værd, afhængigt af din ansøgning, eller de kan skabe flere problemer, end de løser.



  1. Linq til SQL DateTime værdier er lokale (Kind=Uspecificeret) - Hvordan laver jeg det UTC?

  2. Ikke flere data at læse fra stikkontakten

  3. MySQL returnerer første og sidste rekord for på hinanden følgende identiske resultater

  4. Sådan konverteres en streng til en dato/tid i SQL Server ved hjælp af CAST()