Oracle
 sql >> Base de données >  >> RDS >> Oracle

Condition de concurrence entre la sélection et la mise à jour

Je suppose que votre UPDATE l'instruction elle-même vérifie le lastmodified valeur que vous lisez dans votre SELECT déclaration comme le suggère neuf côtés.

Si lastmodified est une DATE , alors il y a une condition de concurrence potentielle s'il y a plusieurs mises à jour de la même ligne dans la même seconde depuis un DATE n'a de granularité qu'à la seconde près. Si lastmodified est un TIMESTAMP , en revanche, la fenêtre dans laquelle la condition de concurrence peut se produire est beaucoup plus limitée puisqu'un TIMESTAMP aura entre 3 et 9 chiffres de précision inférieure à la seconde (3 sur la plupart des machines Windows, 6 sur la plupart des machines Unix). Il est peu probable mais pas impossible que vous ayez deux mises à jour à la même milliseconde ou même à la même microseconde. Mais ce n'est pas infaillible.

Vous pouvez utiliser une valeur générée par séquence au lieu d'une date de dernière modification. Cela peut garantir que vous ne perdrez pas une mise à jour car une séquence NOCYCLE ne renverra pas deux fois la même valeur. Mais si vous suivez cette voie, soit vous perdez l'avantage d'avoir une date de dernière mise à jour sur chaque ligne, soit vous stockez quelques octets de données supplémentaires dans chaque ligne de la table. L'un ou l'autre de ces compromis peut en valoir la peine en fonction de votre application ou peut créer plus de problèmes qu'il n'en résout.