Manejo de concurrencia con SQL server 2000 y VB 6

Estoy desarrollando una aplicación en visual 6.0 y como base de datos utilizo SQL Server 2000, la aplicación esta instalada en varias pc´s y la BD en un servidor. El problema es cuando 2 usuarios tratan de insertar al mismo tiempo un registro, ya que las peticiones son al mismo tiempo y en SQl server solo se guarda la ultima petición. ¿Cómo manejo esta concurrencia?, ¿Es desde código en VB6 o en SQL?
Respuesta
1
Buena pregunta...
Dependerá de quien debe tomar la decisión al introduir los datos.
Me explico, imaginemos que tenemos dos usuarios que tienen una función: funcionAEstudiar() la cual se encarga de mirar cual el es ultimo código asignado dentro de la base de datos para devolverlo a VB y que luego el usuario rellene unos campos y al darle a aceptar rellene la base de datos.
A mi entender el método más sencillos es mediante un semáforo dentro de la BBDD, un campo dentro de una tabla que indique que mientras se esta haciendo un delete, insert o update que ninguna otra función puede acceder a esa tabla.
¿Pero desde donde se controla el semáforo? Se puede hacer en el SQL o en el VB, yo te recomiendo en el SQL para que todas las funciones se mantengan como standards dentro del manejo de la BBDD.
No se si sabes muy bien como va el tema de los semaforos/sockets. Si no lo acabas de conocer avisame y te lo explico con más profundidad.
Hola te agradezco mucho hayas tomado en cuenta mi pregunta, resolví el problema desde código en visual basic, con un bloqueo, sin embargo no siempre desarrollare en visual basic, me interesa saber más acerca de los semáforos que me comentas los de cuales me dices que se pueden hacer en en SQL server, ¿cómo los programas?, ¿Es en el Query analizer, a través de una función, etc?, me gustaría saber más. Gracias
A ver dos cosas antes que me lie, el SS ya incorpora semáforos de base. Pero a veces sabes que entre una solicitud y la respuesta de otro servidor puede dar problemas. Luego es un buen momento para pensar en esto.
De hecho se trata de un chapucilla que a veces hace falta. Te creas una tabla tSemaforo con los campos: nTabla (nVarchar(50)) y iBloqueo (int)
Se trata de tener dos Procedures: fBloquearTabla(@nombreTabla), fLiberarTabla(@nombreTabla)
El fBloquearTabla hará lo siguiente: buscara la tabla indicada dentro de nTabla y mirará si el campo iBloqueo esta a 1, si esta a uno se esperará (wait: hay varios tipos puedes escoger el que prefieras) y lo volverá a comprobar hasta encontrarla a 0.
El fLiberarTabla en cambio ara: Buscar la tabla indicada dentro de nTabla y actualizará el campo iBloqueo a 0.
Teniendo estas dos funciones luego si sabes que vas a lanzar un proceso muy grande y no quieres que hayan choques con otras funciones y te bloqueen la tabla. Antes de empezar cada lanzamiento usaras el fBloquearTabla(tablaABloquear), luego lanzaras lo que quieras hacer y luego lanzarás el fLiberarTabla(tablaABloquear).
Ya esta es sencillo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas