Doble inserción en BD

13/02/2008 - 16:44 por josereginogomezzurbano | Informe spam
Hola a todos y gracias por su ayuda de antemano, les comento:

He realizado una aplicación winform por capas (cliente-servidor con
unos servicios web) y tengo un pequeño problemilla que os intento
explicar resumidamente.


La funcionalidad de la aplicación consiste en que el cliente genera un
evento que manda unos datos al servidor y éste los almacena en una
base de datos SQL Server (mediante un procedimiento almacenado). Hasta
aquí todo bastante normalito, pero cuando el cliente no tiene conexión
con el servidor guarda la información en una base de datos local (para
no perder funcionalidad).

El problema radica en que cuando la red falla (se comprueba a través
del servicio web) los datos se guardan en la base de datos local, pero
si los datos ya han pasado por el servicio web también se guardan en
la base de datos del servidor, es decir se almacenan los datos en las
dos bases de datos. Esto se debe a que la llamada al servicio web
espera un tiempo determinado (timeout) al resultado para lanzar una
excepción y pasar a guardar los datos en la base de datos local, pero
cuando esto se produce la aplicación suele seguir trabajando en el
servidor hasta guardar los datos.


Me imagino que alguien ya habrá sufrido este problema, lo que no sé es
cual es la solución más "correcta" por decirlo de alguna manera. Las
opciones que se me han ocurrido son las siguientes, aunque estoy casi
seguro que no son las únicas:

- Aumentar el timeout del servicio web es una opción que ya he
utilizado, pero no puedo aumentarlo de una manera indiscriminada por
el consiguiente cabreo del cliente
- Realizar un trigger que cuando inserte los datos en la base de datos
del servidor, compruebe si también se insertaron en la base de datos
local y si es así los elimine. Es la opción que más me convence.
- Otra opción, que no me convence demasiado y no estoy muy seguro de
como utilizarla, es la de usar llamadas asíncronas a los servicios
web. Aunque creo que no encaja bien con la filosofía de la aplicación.
- ...


Espero que mi explicación haya sido clara y me puedan ayudar.


Un saludo
 

Leer las respuestas

#1 Paulino Padial
13/02/2008 - 19:02 | Informe spam
La solución de meter esa lógica en la base de datos me gusta :)

A ver si alguien propone algo mas, una solución que se utiliza mucho en un
sistema que puede no tener red constantemente con los servicios web como por
ejemplo una PDA.
Se usan algunos metodos, como, o bien guardar los datos en una bd local, y o
bien comprobarlo en ella en la nueva inserción, o un proceso o trabajo que
vaya repasando las cosas pendientes que pueda tener la base de datos... o
bien, a un fichero local XML de modo que puedas tenerlo cargado en memoria y
que funcione como una base de datos local, pudiendo hacer comparaciones al
hacer un insert entre el conjunto de datos de la base de datos final y este
fichero XML.


Saludos Cordiales,

escribió en el mensaje de
noticias:
Hola a todos y gracias por su ayuda de antemano, les comento:

He realizado una aplicación winform por capas (cliente-servidor con
unos servicios web) y tengo un pequeño problemilla que os intento
explicar resumidamente.


La funcionalidad de la aplicación consiste en que el cliente genera un
evento que manda unos datos al servidor y éste los almacena en una
base de datos SQL Server (mediante un procedimiento almacenado). Hasta
aquí todo bastante normalito, pero cuando el cliente no tiene conexión
con el servidor guarda la información en una base de datos local (para
no perder funcionalidad).

El problema radica en que cuando la red falla (se comprueba a través
del servicio web) los datos se guardan en la base de datos local, pero
si los datos ya han pasado por el servicio web también se guardan en
la base de datos del servidor, es decir se almacenan los datos en las
dos bases de datos. Esto se debe a que la llamada al servicio web
espera un tiempo determinado (timeout) al resultado para lanzar una
excepción y pasar a guardar los datos en la base de datos local, pero
cuando esto se produce la aplicación suele seguir trabajando en el
servidor hasta guardar los datos.


Me imagino que alguien ya habrá sufrido este problema, lo que no sé es
cual es la solución más "correcta" por decirlo de alguna manera. Las
opciones que se me han ocurrido son las siguientes, aunque estoy casi
seguro que no son las únicas:

- Aumentar el timeout del servicio web es una opción que ya he
utilizado, pero no puedo aumentarlo de una manera indiscriminada por
el consiguiente cabreo del cliente
- Realizar un trigger que cuando inserte los datos en la base de datos
del servidor, compruebe si también se insertaron en la base de datos
local y si es así los elimine. Es la opción que más me convence.
- Otra opción, que no me convence demasiado y no estoy muy seguro de
como utilizarla, es la de usar llamadas asíncronas a los servicios
web. Aunque creo que no encaja bien con la filosofía de la aplicación.
- ...


Espero que mi explicación haya sido clara y me puedan ayudar.


Un saludo

Preguntas similares