Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Evitar inconsistencia de información al realizar 2 insert al mismo tiempo

Estas en el tema de Evitar inconsistencia de información al realizar 2 insert al mismo tiempo en el foro de SQL Server en Foros del Web. Hola, les comento: Tengo una aplicación de escritorio para reservacion de mesas las cuales tienen un cierto número de sillas, en la cual cuando se ...
  #1 (permalink)  
Antiguo 01/12/2012, 16:29
Avatar de mandrakedev  
Fecha de Ingreso: septiembre-2012
Ubicación: Guatemala
Mensajes: 14
Antigüedad: 11 años, 7 meses
Puntos: 0
Evitar inconsistencia de información al realizar 2 insert al mismo tiempo

Hola, les comento:
Tengo una aplicación de escritorio para reservacion de mesas las cuales tienen un cierto número de sillas, en la cual cuando se realizan dos INSERT al mismo tiempo desde dos computadoras seleccionando el mismo número de mesa se sobrepasa la cantidad de sillas con las que cuenta la mesa.
Esto me crea inconsistencia en la información, me gustaría que opinaran sobre como resolver mi inconveniente.

De antemano, muchas gracias.

Última edición por mandrakedev; 02/12/2012 a las 17:14
  #2 (permalink)  
Antiguo 03/12/2012, 00:49
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Evitar inconsistencia de información al realizar 2 insert al mismo tiempo

Se puede evitar tal problema con una clave primaria que no permita la inserción de duplicaciones. Por ejemplo- una clave construida de la fecha y del número de la mesa.

Otra opción es que la instrucción de Insert tenga una restricción que no la permita si ya existe una reservación.
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #3 (permalink)  
Antiguo 03/12/2012, 09:14
Avatar de mandrakedev  
Fecha de Ingreso: septiembre-2012
Ubicación: Guatemala
Mensajes: 14
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Evitar inconsistencia de información al realizar 2 insert al mismo tiempo

Gracias por tu respuesta, de hecho esa restricción si existe es la integridad referencial, tambien se verifica antes del insert que los datos de esa reservación no existan.
Te comento, realizamos una prueba en donde al hacer click en el boton de guardar exactamente al mismo tiempo guardó los dos registros (Por ejemplo una reservacion de 5 sillas y otro de 4 sillas para la misma mesa, pero la capacidad de la mesa es de 8 sillas) entonces a la hora de ver la disponiblidad de las mesas esa mesa me aparece con disponibilidad -1.

Última edición por mandrakedev; 03/12/2012 a las 09:29
  #4 (permalink)  
Antiguo 03/12/2012, 12:22
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Evitar inconsistencia de información al realizar 2 insert al mismo tiempo

Maneje transacciones explicitas, BEGIN TRAN, COMMIT TRAN, ROLLBACK TRAN
__________________
MCTS Isaias Islas
  #5 (permalink)  
Antiguo 03/12/2012, 13:47
Avatar de mandrakedev  
Fecha de Ingreso: septiembre-2012
Ubicación: Guatemala
Mensajes: 14
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Evitar inconsistencia de información al realizar 2 insert al mismo tiempo

¿de ese tipo de colisiones se encarga SQL SERVER? al utilizar transacciones del lado del servidor.
  #6 (permalink)  
Antiguo 03/12/2012, 13:59
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Evitar inconsistencia de información al realizar 2 insert al mismo tiempo

Es correcto, las transacciones deben ir siempre en la capa de la base de datos, con esto te aseguras que siempre se cumpla la declarativa de integridad.
__________________
MCTS Isaias Islas
  #7 (permalink)  
Antiguo 03/12/2012, 14:26
Avatar de mandrakedev  
Fecha de Ingreso: septiembre-2012
Ubicación: Guatemala
Mensajes: 14
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Evitar inconsistencia de información al realizar 2 insert al mismo tiempo

Lo de las transacciones no me funcionó quiza no las estoy utilizando bien, quizá podrias ampliar el tema.
La solución fue lo que menciona GeriReshef de la llave compuesta por el id de la mesa y la fecha y la hora.

Gracias

Saludos
  #8 (permalink)  
Antiguo 03/12/2012, 14:56
Avatar de mandrakedev  
Fecha de Ingreso: septiembre-2012
Ubicación: Guatemala
Mensajes: 14
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Evitar inconsistencia de información al realizar 2 insert al mismo tiempo

Cita:
Iniciado por iislas Ver Mensaje
Es correcto, las transacciones deben ir siempre en la capa de la base de datos, con esto te aseguras que siempre se cumpla la declarativa de integridad.
No me funcionó, quiza puedas ampliar el tema.
Saludos
  #9 (permalink)  
Antiguo 03/12/2012, 16:43
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Evitar inconsistencia de información al realizar 2 insert al mismo tiempo

puedes manejar constraints donde si el total de sillas es mayor a lo que tienes no haga la actualizacion, manejar llaves foraneas como ya te dijeron o no muy recomendado pero tambien funcionaria es manejando triggers :P
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #10 (permalink)  
Antiguo 03/12/2012, 17:21
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Evitar inconsistencia de información al realizar 2 insert al mismo tiempo

Maxi DAccoto nos explica como es el manejo de transacciones

http://blog.maxiaccotto.com/post/200...QL-Server.aspx
__________________
MCTS Isaias Islas

Etiquetas: inconsistencia, server, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:47.