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

Preguntas similare

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
Respuesta Responder a este mensaje
#2 Jose Camacho Vaca
19/03/2008 - 18:25 | Informe spam
Tengo entendido que el SQL-Server tiene un servicio de replicación que te
hace eso de manera automática. Yo nunca lo he probado pero tengo entendido
que si tienes el SQLServer2000 (la versión grande) en tu server y en tus
terminales tienes msde puedes hacer un servicio de replicación automático.
Espero haberte ayudado, saludos.
José Camacho Vaca
Colima, MX


"Paulino Padial" wrote:

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


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida