La propiedad Timestamp
es en realidad un Lamport timestamp. Se garantiza que siempre crecerá con el tiempo y, aunque se presenta como un valor DateTime
, en realidad no lo es.
En el lado del servidor, es decir, almacenamiento de Windows Azure, para cada cambio hace esto:
nextTimestamp = Math.Max(currentTimestamp + 1, DateTime.UtcNow)
Esto es todo lo que hay que hacer. Y, por supuesto, está garantizado que suceda de forma transaccional. El objetivo de todo esto es proporcionar un reloj lógico (función monotónica) que se pueda utilizar para garantizar que el orden de los eventos suceda en el orden previsto.
Aquí hay un enlace a una versión del actual WAS paper y si bien no contiene ninguna información sobre el esquema de marca de tiempo específicamente tiene suficientes cosas allí que rápidamente se da cuenta de que solo hay una conclusión lógica que puede sacar de esto. Cualquier otra cosa sería estúpido. Además, si tienes alguna experiencia con LevelDB, Cassandra, Memtables y su estilo, verás que el equipo de WAS siguió la misma ruta.
Aunque debo aclarar que, dado que WAS proporciona un modelo de coherencia fuerte, la única manera de mantener la marca de tiempo es hacerlo con candado y llave, por lo que no hay manera de adivinar la próxima marca de tiempo correcta. Debe consultar WAS para obtener la información. No hay forma de evitar eso. Sin embargo, puede mantener un valor anterior y presumir que no cambió. WAS le dirá si lo hizo y luego podrá resolver la condición de carrera de la forma que mejor le parezca.
Gracias Seva - Ya estaba usando un campo adicional, solo buscando ver si había alguna forma de usar el campo autogenerado. – Stuart