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.