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

Condizione di gara tra selezionare e aggiornare

Presumo che il tuo UPDATE l'istruzione stessa sta verificando l'lastmodified valore che hai letto nel tuo SELECT affermazione come suggerisce nove lati.

Se lastmodified è una DATE , allora esiste una potenziale condizione di competizione se sono presenti più aggiornamenti nella stessa riga nello stesso secondo da un DATE ha solo granularità al secondo. Se lastmodified è un TIMESTAMP , invece, la finestra in cui può manifestarsi la race condition è molto più limitata poiché un TIMESTAMP avrà tra 3 e 9 cifre di precisione inferiore al secondo (3 sulla maggior parte delle macchine Windows, 6 sulla maggior parte delle macchine Unix). È piuttosto improbabile, anche se non impossibile, avere due aggiornamenti allo stesso millisecondo o addirittura allo stesso microsecondo. Ma non è infallibile.

È possibile utilizzare un valore generato dalla sequenza anziché una data dell'ultima modifica. Ciò può garantire che non perderai un aggiornamento poiché una sequenza NOCYCLE non restituirà lo stesso valore due volte. Ma se segui quel percorso, stai perdendo il vantaggio delle informazioni di avere una data dell'ultimo aggiornamento su ogni riga o stai memorizzando alcuni byte di dati extra in ogni riga della tabella. Uno di questi compromessi potrebbe valere la pena a seconda della tua applicazione o potrebbe creare più problemi di quanti ne risolva.