sql >> Base de Datos >  >> RDS >> Oracle

Condición de carrera entre seleccionar y actualizar

Supongo que su UPDATE declaración en sí está verificando el lastmodified valor que lees en tu SELECT declaración como sugiere nueve lados.

Si lastmodified es una DATE , entonces existe una posible condición de carrera si hay varias actualizaciones en la misma fila en el mismo segundo desde una DATE sólo tiene granularidad a la segunda. Si lastmodified es un TIMESTAMP , por otro lado, la ventana en la que puede ocurrir la condición de carrera es mucho más limitada ya que un TIMESTAMP tendrá entre 3 y 9 dígitos de precisión de subsegundos (3 en la mayoría de las máquinas Windows, 6 en la mayoría de las máquinas Unix). Es bastante improbable, aunque no imposible, que tenga dos actualizaciones en el mismo milisegundo o incluso en el mismo microsegundo. Pero no es infalible.

Puede usar un valor generado por secuencia en lugar de una fecha de última modificación. Eso puede garantizar que no perderá una actualización ya que una secuencia NOCYCLE no devolverá el mismo valor dos veces. Pero si sigue ese camino, perderá el beneficio de la información de tener una última fecha de actualización en cada fila o almacenará algunos bytes adicionales de datos en cada fila de la tabla. Cualquiera de estas compensaciones puede valer la pena dependiendo de su aplicación o puede crear más problemas de los que resuelve.