Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Condição de corrida entre selecionar e atualizar


Estou assumindo que seu UPDATE A instrução em si está verificando o lastmodified valor que você lê em seu SELECT declaração como o ninesided sugere.

Se lastmodified é uma DATE , haverá uma possível condição de corrida se houver várias atualizações na mesma linha no mesmo segundo desde um DATE só tem granularidade para o segundo. Se lastmodified é um TIMESTAMP , por outro lado, a janela na qual a condição de corrida pode ocorrer é muito mais limitada, pois um TIMESTAMP terá entre 3 e 9 dígitos de precisão de subsegundos (3 na maioria das máquinas Windows, 6 na maioria das máquinas Unix). É bastante improvável, embora não impossível, que você tenha duas atualizações no mesmo milissegundo ou mesmo no mesmo microssegundo. Mas não é infalível.

Você pode usar um valor gerado por sequência em vez de uma data da última modificação. Isso pode garantir que você não perderá uma atualização, pois uma sequência NOCYCLE não retornará o mesmo valor duas vezes. Mas se você seguir esse caminho, estará perdendo o benefício de informação de ter uma última data de atualização em cada linha ou está armazenando alguns bytes extras de dados em cada linha da tabela. Qualquer uma dessas compensações pode valer a pena dependendo do seu aplicativo ou pode criar mais problemas do que resolver.