Estoy escribiendo un software sincronizador que tomará todos los cambios en una base de datos y los sincronizará con otra base de datos. Con este fin he añadido en mi mesa T
dos columnas:¿Existe una posible condición de carrera en esta declaración de ACTUALIZACIÓN?
alter table T add LastUpdate rowversion, LastSync binary(8) not null default 0
Ahora puedo seleccionar fácilmente todas las filas que han cambiado desde la última sincronización:
select * from T where LastUpdate > LastSync
Sin embargo después de realizar la sincronización de lo que debería hacer que los dos campos sean iguales. Sin embargo, la actualización de la fila también actualiza la marca de tiempo, por lo que tiene que hacer esto:
update T set [email protected]@DBTS+1 where [email protected]
Pero me pregunto - se presente siempre funciona? ¿Qué pasa si leo el valor de @@DBTS
y luego otro usuario logra insertar/actualizar una fila en alguna parte antes de que se comprometa mi fila? ¿Es este código arriesgado? Y si es así, ¿cómo podría mejorarse?
Por cierto, ¿en qué versión y edición de SQL Server se encuentra? ¿Es [Change Data Capture] (http://msdn.microsoft.com/en-us/library/bb522489.aspx) una opción? –
@Martin Smith - 2008, creo. No estoy seguro de lo que tiene el cliente –
@Martin Smith - Revisé la captura de datos modificados, pero sería una exageración. Una simple marca de tiempo será suficiente. Solo necesito saber qué registros aún deben sincronizarse. No necesito el historial completo. –