Vereis, tengo una aplicación cliente servidor que hace unas escrituras en una base de datos. El problema es que tengo que sincronizar varias cosas y ayer analizando a un cliente vi que sucedió algo extraño y que no he podido tracear.
Para que nos entendamos todos, voy a simplificar el problema:
Supongamos una base de datos con tabla de una columna de 20 registros. Estos 20 registros tienen una columa con un valor a 0. En esta tabla de vez en cuando se agregan más registros con valor a 0. De vez en cuando, hay un proceso en el servidor que actualiza todos los valores que están a 0 a un número, vamos a llamarlo X.
A su vez, los clientes preguntan por los registros que tienen el número X. El proceso tiene que ser atómico, es decir, o envías todos los registros cuya columna es X o no envías ninguno.
Hasta ahora, yo hacía esto:
El servidor para guardar en una transacción abre una transacción y hace esto:
Abro transacción
SELECT TOP 1000 LoQueSea FROM Tabla WITH(updlock, readpast) WHERE Columna = 0
Si NumeroDeColumnas > 0
Hago cosas
Por cada columna
UPDATE Tabla SET Columna = X WHERE Linea = ESTALINEA
End Por
End Si
Cierro Transacción
El cliente
SELECT LoQueSea FROM Tabla WHERE Columna = X WITH (updlock, readpast)
La duda viene porque por algún un motivo, el cliente no tiene uno de esos registros. Es la primera veez que ha pasado en 2 años y me gustaría saber si ha podido ocurrir lo siguiente:
El servidor estaba Updateando los registros de 0 a X. A su vez el cliente hizo un select, la transacción debería ser bloqueante por lo que el SELECT solo debe leer o todos los registros de X o ninguno. Ha podido pasar que el cliente recibiera solo algunas líneas transformadas a X y no todas?????
No se si me he explicado bien jejejej.