Jag antar att din UPDATE
uttalandet självt verifierar lastmodified
värde som du läser i din SELECT
uttalande som ninesided antyder.
Om lastmodified
är ett DATE
, då finns det ett potentiellt tävlingstillstånd om det finns flera uppdateringar av samma rad under samma sekund sedan en DATE
har bara granularitet till den andra. Om lastmodified
är en TIMESTAMP
, å andra sidan är fönstret där tävlingsförhållandet kan inträffa mycket mer begränsat eftersom en TIMESTAMP
kommer att ha mellan 3 och 9 siffror av subsekunders precision (3 på de flesta Windows-maskiner, 6 på de flesta Unix-maskiner). Det är ganska osannolikt men inte omöjligt att du skulle ha två uppdateringar på samma millisekund eller till och med samma mikrosekund. Men det är inte ofelbart.
Du kan använda ett sekvensgenererat värde istället för ett senast ändrat datum. Det kan garantera att du inte förlorar en uppdatering eftersom en NOCYCLE-sekvens inte returnerar samma värde två gånger. Men om du går in på den vägen, förlorar du antingen informationsfördelen med att ha ett senaste uppdateringsdatum på varje rad eller så lagrar du några extra byte med data på varje rad i tabellen. Endera av dessa kompromisser kan vara värt det beroende på din applikation eller kan skapa fler problem än det löser.