PDA

Ver la Versión Completa : Colision registros


Bluechip
22-11-2006, 13:37:28
Hola a todos.

Soy nuevo por estos lares y me gustaria que me echaseis una manita.
Tengo una aplicación funcionando hace 7 años con unos 15 puestos.
Todo va ok pero de vez en cuandome hace una gracia que no llego a ver como solucionarla.

La cosa está en que cuando dos usuarios dan de alta un cliente, solo en estrañas ocasiones, colisionan y uno se pierde.

El sistema que uso es leer el último cliente, incremento el código (+1) y lo guardo para que si acto seguido hay otro alta, coja el siguiente.

Pues bien, pese a incrementar y rapidamente guardar el registro con el consabido Pos y FlushBuffers, como os digo, a veces chocan...

Toy desesperado...

Neftali [Germán.Estévez]
22-11-2006, 13:52:42
No das muchos datos técnicos (Base de Datos,...), pero ¿Podrías probar a utilizar transacciones?

Bluechip
22-11-2006, 14:28:15
Que hay.

La base que uso es paradox y no, no uso transiciones. Me resultan complejas para el uso que tiene la base. Solo existe ese problemilla y es muy esporádico.
La verdad es que me da mucha perza remodelar todo por eso solo.

grcias

AzidRain
27-11-2006, 07:54:03
El problema es que esta mal modelado desde el principio y creo que no tuviste en cuenta la concurrencia que pudiera darse. A veces efectivamente es por milesimas de segundo pero sucede. Supongamos que un puesto esta dando de alta un cliente (A) y al mismo tiempo otro puesto hace lo mismo(B). Digamos que tienes el ultimo numero en 100. Entonces A checa y calcula el proximo en 101, al mismo tiempo B hace exactamente lo mismo y obtiene obviamente el mismo valor (suponemos que como A no ha guardado aun su informacion el valor 100 no se ha movido). Entonces A finalmente guarda sus datos sin problemas e inmediatamente despues de eso B intenta guardar. Como esta usando la misma clave, y suponemos que esta correctamente definida la clave principal para evitar duplicados, el manejador de BD no permite guardar (duplicate Key error) y el registro que se intentaba guardar se pierde (el de B). Obviamente todo esto paso en fracciones de segundo.

Por que es un mal modelo? Porque aun suponiendo la situacion anterior, el sistema deberia poder recuperarse del error en la clave y ya sea mandarle el mensaje al usuario sin perder el registro o bien incrementar la clave una vez mas hasta conseguir poder guardarlo. En "La cara oculta" de Marteens trae un capítulo que habla de este problema y el manejo de transacciones, seguro te servirá.

Una solucion mucho mas sencilla, es usar en tu table de clientes un campo autoincrementado (Paradox lo soporta) y asi te olvidas ya que es Paradox quien se encarga de asignar las claves y obviamente nunca se presenta el problema que vimos ya que la clave sea asigna justo al momento de guardar el registro por lo que es imposible que se pierda.

Por último:

La verdad es que me da mucha perza remodelar todo por eso solo.

Recuerda el conocido refrán: "El flojo y el mezquino andan dos veces el camino"..:)