Paro del servicio de SQL Server

Yo aquí de nuevo, esta vez tengo una duda un tanto extraña. Te cuento:
He realizado una consulta que actualiza algunos campos del Servidor A (por llamarle de alguna manera) según las diferencias de los datos que están en el Servidor B (por tanto son servidores vinculados) funciona, ahora bien, el problema esta en que hubo un determinado momento que se actulizo todo correctamente y para yo verificar que el proceso hacia lo correcto, modifique un dato del Servidor A para que se ejecutara (obviamente), más sin embargo al quererlo modificar yo desde el Enterprise Manager me marco un error de tiempo de respuesta y de ahí no salio en un buen rato, así que decidí reiniciar el servicio de la instancia que estaba ocupando y vuala... Los datos que yo modifique anteriormente (con error) volvieron a aparecer, es decir, antes de reiniciar el servicio todos los datos de ambos servidores coincidían pero después de ello regresaron al estado en que estaban antes de que corriera la consulta de actualización.
Es como si hubiera hecho un rollback cuando reinicie el servicio... ¿Qué crees que este pasando?
Por tu ayuda muchas gracias de antemano y espero no haberte hecho un embrollo con la explicación.

1 Respuesta

Respuesta
1
Por lo que he entendido, has tenido un error de datos y has querido corregirlo y se demoraba, luego reiniciaste servicio y tuviste los datos como al principio, bueno si eso ese así significa que hizo un ROLLBACK tu transacción, antes de eliminar cualquier tipo de conexión de update debes revisar porque esta demorando, es posible que hayas tenido las tablas bloqueadas, o dentro de una transacción que esperaba respuesta de otro subproceso (estado suspend) por lo que cuando mataste la conexión o reiniciar servicio simplemente se rollbackeo, debes tener cuiodado como te repito, usa el sp_who active para saber que procesos están bloqueados o entra al monitor de actividades para que puedas guiarte también.
Espero te sirva la explicación y si tienes una duda adicional me avisas.
¿Qué crees?... He checado lo que mencionabas y efectivamente se bloquea una tabla, más sin embargo mis conocimientos aun están incompletos en esto. Lo que pasa es que la consulta que ejecuto utiliza un cursor para comparar los datos obtenidos; estos datos son comparados por secciones por tanto utilizo IF... ELSE anidados, en un inicio (para comprobar cuantos registros entran en cada una de las condiciones) inserto un registro en un una variable de tipo tabla (aunque es temporal, ya que una vez que sepa que entran donde deberían se reemplazaría por el INSERT O UPDATE según corresponda la acción para corregir datos). Más o menos así:
.
.
.
.
DECLARE UpdDts CURSOR FAST_FORWARD FOR
 SELECT F.Id, Folio, ClienteF, Cancelada, Total, PV.Id, FolioPV, ClientePV, Cancel, TotalPV, Suc
  FROM  TB1 F
   JOIN DTB1 DF ON F.Id = DF.Id
   JOIN (SELECT FPV.Id, Folio + ' '  + Valor FolioPV, ClientePV, Cancel, TotalPV
     FROM  [SERVERPV].DBPV.dbo.DTBL DFPV
      JOIN  [SERVERPV].DBPV.dbo.TBL FPV ON FPV.Id = DFPV.Id
      JOIN  [SERVERPV].DBPV.dbo.SERIE S ON S.Id = Sir AND S.NoFact = 1
     GROUP BY FPV.Id, Folio, Valor, ClientePV, Cancel,TotalPV) PV ON F.IdFPV = PV.Id AND Suc = 4
  WHERE IdFPV <> 0
  GROUP BY F.Id, Folio, ClienteF, Cancelada, Total, PV.Id, FolioPV, ClientePV, Cancel, TotalPV, Suc
  ORDER BY F.Id
OPEN UpdDst
FETCH NEXT FROM UpdDst INTO @IdFF, @FolioF, @ClienteF, @CancelF, @TF, @IdFPV, @FolioPV, @ClientePV, @CancelPV, @TPV, @Suc
WHILE @@FETCH_STATUS = 0 BEGIN
 SET @Dif = ABS(@TF - @TPV)
 BEGIN TRANSACTION
 IF @FolioF <> @FolioPV BEGIN
--  UPDATE TB1 SET Folio = @FolioPV WHERE Id = @IdFF AND IdFPV = @IdFPV AND Sucl = @Suc
  INSERT @Tabla (Obs) VALUES ( 'Actualizar Folio de ' + @FolioF + ' a ' + @FolioPV)
  GOTO Siguiente
 END ELSE BEGIN
Siguiente:
  IF @CancelF <> @CancelPV BEGIN
   IF @CancelF = 1 AND @CancelPV = 0 BEGIN
    INSERT @Tabla (Obs) VALUES ( 'Se reestablece ' + @FolioF )
--    UPDATE TB1 SET Cancelada = 0 WHERE Id = @IdFF AND IdFPV = @IdFPV AND Suc = @Suc
    GOTO Siguiente2
   END ELSE BEGIN
    INSERT @Tabla (Obs) VALUES ( 'Actualiza Estatus en ' + @FolioF )
/*    UPDATE TB1 SET Cancelada = 1 WHERE Id = @IdFF AND IdFPV = @IdFPV AND Suc = @Suc
    UPDATE DTB1 SET K = 0 WHERE Id = @IdFF
    EXEC CP_RehacerPF @IdFF*/
    GOTO NextF
   END
.
.
.
.
Así hasta terminar con las comparaciones, lo que esta en comentarios es lo que realmente iría, es decir los INSERT en la variable de tipo tabla ya no esatrían.
El detalle esta en que cada que ejecuto la consulta para checar cuales son los registros que se modificarían y en que se modificarían sale bien, pero deja bloqueada esta variable de tipo tabla... la pregunta del millón... ¿por qué?
De antemano muchísimas gracias por tu atención, paciencia y valiosísima ayuda.
P.D. Espero no haberte enmarañado tanto :)
Tu consulta es un poco enredada, y no me refiero al código, el porque se bloquea tu tabla es simple: le mandas un begin transaction a la tabla y no haces un commit o rollback, te puedo recomendar lo siguiente:
por cada operacion de update realizarlo dentro de una transaccion pequeña, es decir
begin tran
update tabla set col1= dato1
commit
y luego continuar con tu proceso, ya que si metes comparaciones, validaciones, etc dentro de un bloque begin tran, demoraras mucho mas en liberar el recurso y puede producirse bloqueos con mayor frecuencia.
Me comentas si aun tienes problemas.
A ok... realmente si lo hago pero hasta el final, una vez que haya terminado el proceso o mejor dicho por registro, es decir ya que haya recorrido todos los IF.. ELSE, voy a probar de la manera en que me indicas, gracias.
Ok,
Suerte y no te olvides de cerrar la pregunta una vez que hayas podido realizar tu solución.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas