sql >> Database >  >> RDS >> Oracle

Raceconditie tussen selecteren en updaten

Ik ga ervan uit dat uw UPDATE statement zelf verifieert de lastmodified waarde die u leest in uw SELECT verklaring zoals Ninesided suggereert.

Indien lastmodified is een DATE , dan is er een potentiële raceconditie als er meerdere updates zijn voor dezelfde rij in dezelfde seconde sinds een DATE heeft slechts granulariteit tot de tweede. Indien lastmodified is een TIMESTAMP , aan de andere kant is het venster waarin de raceconditie kan optreden veel beperkter omdat een TIMESTAMP tussen de 3 en 9 cijfers van minder dan een seconde nauwkeurig (3 op de meeste Windows-machines, 6 op de meeste Unix-machines). Het is vrij onwaarschijnlijk, maar niet onmogelijk, dat je twee updates hebt op dezelfde milliseconde of zelfs dezelfde microseconde. Maar het is niet onfeilbaar.

U kunt een door een reeks gegenereerde waarde gebruiken in plaats van een laatste wijzigingsdatum. Dat kan garanderen dat u geen update verliest, aangezien een NOCYCLE-reeks niet twee keer dezelfde waarde retourneert. Maar als u dat pad bewandelt, verliest u ofwel het informatievoordeel van het hebben van een laatste updatedatum op elke rij, of u slaat een paar extra bytes aan gegevens op in elke rij van de tabel. Een van deze afwegingen kan de moeite waard zijn, afhankelijk van uw toepassing, of een van beide kan meer problemen veroorzaken dan het oplost.



  1. Tel rijen totdat de waarde in de kolom verandert mysql

  2. Extraheer de n-de subtekenreeks

  3. Meerdere foutmeldingen vastleggen vanuit een enkele instructie in TRY CATCH

  4. De geparametriseerde query ..... verwacht de parameter '@units', die niet is opgegeven