Foros del Web » Programación para mayores de 30 ;) » Java »

Problemas cuando dos personas registran datos al mismo tiempo en mi aplicacion

Estas en el tema de Problemas cuando dos personas registran datos al mismo tiempo en mi aplicacion en el foro de Java en Foros del Web. Hola chicos, mi problema es el siguiente: cree una aplicacion y la utilizan dos personas a veces mas. el formulario te muestra un numero generado, ...
  #1 (permalink)  
Antiguo 08/06/2013, 14:47
 
Fecha de Ingreso: junio-2013
Mensajes: 12
Antigüedad: 11 años, 5 meses
Puntos: 0
Problemas cuando dos personas registran datos al mismo tiempo en mi aplicacion

Hola chicos, mi problema es el siguiente: cree una aplicacion y la utilizan dos personas a veces mas. el formulario te muestra un numero generado, cuando terminan de ingrear los datos le dan click a "guardar" y a veces lo hacen al mismo tiempo estas personas(ojo cada una esta en su pc usando la aplicacion), ellos me dicen que cuando guardan al mismo tiempo los datos se percatan que en la grilla los datos que guardó el usuario A sale con algunos datos del usuario B, es decir los datos se cruzan. otro problema es que a veces simplemente no guarda ningun registro, y tienen que volver a ingresar datos. Pienso yo que hago mal al mostrar primero el numero generado, creo que deberia de generar despues del clic, pero tengo dudas, donde es conveniente meter este codigo de autogeneracion, en java o en la base de datos. por favor si ya han visto este problema, como lo resolviron, ayudenme, gracias.
  #2 (permalink)  
Antiguo 08/06/2013, 15:45
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 2 meses
Puntos: 454
Respuesta: Problemas cuando dos personas registran datos al mismo tiempo en mi aplica

Hola:

Si ese número autogenerado es de alguna forma lo que hace de identificador de los datos, puedes dejar que sea la base de datos el que lo genere, o puedes hacerlo desde java. Lo importante si lo haces desde java es que ese número sea siempre distinto, no puede ser que a dos usuarios les des el mismo número.

Se buena.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 08/06/2013, 17:20
 
Fecha de Ingreso: junio-2013
Mensajes: 12
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Problemas cuando dos personas registran datos al mismo tiempo en mi aplica

Gracias por tu repuesta, ese numero es identificador, en el codigo java tengo un metodo para que no garbe duplicados, si en caso ese numero ya existe coge el ultimo de la base de datos y le agrega un numero, lo cual funciona a veces. pero mi pregunta aparte de la solucion es que: ¿qué es lo ideal, como se debe programar, cual es la buena practica en este caso?. para que no suceda esto cuando el registrar es simultaneo.
  #4 (permalink)  
Antiguo 08/06/2013, 17:25
 
Fecha de Ingreso: diciembre-2011
Mensajes: 152
Antigüedad: 13 años
Puntos: 34
Respuesta: Problemas cuando dos personas registran datos al mismo tiempo en mi aplica

Cita:
Iniciado por metalgirl_x Ver Mensaje
Gracias por tu repuesta, ese numero es identificador, en el código java tengo un método para que no grabe duplicados, si en caso ese numero ya existe coge el ultimo de la base de datos y le agrega un numero, lo cual funciona a veces. pero mi pregunta aparte de la solución es que: ¿qué es lo ideal, como se debe programar, cual es la buena practica en este caso?. para que no suceda esto cuando el registrar es simultaneo.
En un ambiente concurrente debes de ser muy cuidadosa con este tipo de cosas, por que si tu aplicación trabaja con múltiples hilos probablemente sea un problema de concurrencia a la hora de trabajar con los datos.
  #5 (permalink)  
Antiguo 08/06/2013, 17:34
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 2 meses
Puntos: 454
Respuesta: Problemas cuando dos personas registran datos al mismo tiempo en mi aplica

Hola:

Si coges el último de la base de datos y le sumas 1, puedes obtener dos veces el mismo si dos usuarios lo piden y no graban en un rato.

Lo correcto es que la base de datos genere el id (mysql tiene autoincrement y otras bases de datos tienen secuencias). El id no se debería mostrarse al usuario y no necesitas dárselo antes de que grabe.

La otra opción, si lo haces desde java, es que lo tengas en una variable estática en una clase como un contador. Cada vez que necesites uno, lo incrementas. Esto no es correcto del todo porque si reinicias la aplicación, el contador volvería a cero, así que en el arranque de la aplicación si debes leer el último de la base de datos +1 para iniciar ese contador. A partir de ahí, mientras la aplicación siga arrancada, vas incrementado el contador.

Se buena.
__________________
Apuntes Java
Wiki de Programación
  #6 (permalink)  
Antiguo 09/06/2013, 21:45
 
Fecha de Ingreso: octubre-2010
Mensajes: 219
Antigüedad: 14 años, 1 mes
Puntos: 2
Respuesta: Problemas cuando dos personas registran datos al mismo tiempo en mi aplica

claramente es un problema de concurrencia,tendrías que sincronizar con semáforos o monitores.Cuando decís: coge el ultimo de la base de datos y le agrega un numero.toda esa parte mas la del guardado de ese numero en la base tiene que ser de manera atómica.
  #7 (permalink)  
Antiguo 11/06/2013, 13:08
Avatar de fahs82  
Fecha de Ingreso: abril-2012
Ubicación: guadalajara
Mensajes: 139
Antigüedad: 12 años, 7 meses
Puntos: 12
Respuesta: Problemas cuando dos personas registran datos al mismo tiempo en mi aplica

en mi caso yo asigno el numero de folio hasta que se termina y se graba , como asignándole un numero de ficha con un autoincrementable de la bd te explicare la rutina que tengo por ejemplo en la captura de mi modulo de ventas

por ejemplo tengo en la base de datos una tabla llamada lista_notas_venta , en ella tengo un campo llamado folio que es de tipo autoincrementable ,entre otros campos mas que guardan los detalles generales de la nota de venta , al terminar la venta ingreso un insert con un resultset que me retorna las keys generadas , en este caso seria el numero asignado al campo folio y lo capturo en un string , después hago el update correspondiente , te muestro un código de ejemplo para que te des una idea ,otra cosa que puedes hacer es tener una tabla llamada transacciones , al iniciar tu procedimiento realizas un insert y retornas el valor , una vez que terminen la captura puedes hacer el insert a tu otra tabla correspondiente utilizando como referencia el numero de transaccion , aunque esto para mi seria un desperdicio de espacio y limitante , pues con el tiempo quienes no terminen o cancelen su captura te generaría números de transacción desperdiciados , pero ojo , no puedes asignar un folio antes de completar la transacción o captura pues te pasaría la situación que te ha estado sucediendo siempre

Código:
public void TerminarVenta()throws SQLException{

//Declaro mi conexion
ConexionMySQL ConexionMysql = new ConexionMySQL();
Connection cn = ConexionMysql.Conectar();
//Hago una instancia de un resultset de donde extraeré el numero o key generado para el folio de la nota
ResultSet IdFolioNota = null;
try{
//creo un prepared statement con el parámetro de retornar las keys generadas
PreparedStatement pstFolioNota = cn.prepareStatement("Insert into LISTANOTAS(FOLIO,N_ALMACEN,ID_VENDEDOR,TOTAL_ARTICULOS,SUB_TOTAL,IVA,TOTAL,TASA_IVA,PAGO_VALE,PAGO_AMEX,PAGO_TARJETA,PAGO_EFECTIVO,IMPORTE_PAGO,IMPORTE_CAMBIO,FOLIO_CP,ESTATUS)Values(null,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",PreparedStatement.RETURN_GENERATED_KEYS); 
pstFolioNota.setString(1,NumeroAlmacen);
pstFolioNota.setString(2,NumeroVendedor);
pstFolioNota.setString(3,String.valueOf(TotalArticulos));
pstFolioNota.setString(4,df.format(Subtotal));
pstFolioNota.setString(5,df.format(Iva));
pstFolioNota.setString(6,df.format(ImporteTotal));
pstFolioNota.setString(7,df.format(TasaIva));
pstFolioNota.setString(8,df.format(PagoVale));
pstFolioNota.setString(9,df.format(PagoAmex));
pstFolioNota.setString(10,df.format(PagoTarjeta));
pstFolioNota.setString(11,df.format(PagoEfect));
pstFolioNota.setString(12,df.format(TotalPago));
pstFolioNota.setString(13,df.format(TotalCambio));
pstFolioNota.setString(14,FolioParcial);
pstFolioNota.setString(15,"3");
pstFolioNota.executeUpdate();
//paso al resultset instanciado las keys generadas
IdFolioNota = pstFolioNota.getGeneratedKeys();
//coloco el cursor para iniciar el ciclo
IdFolioNota.beforeFirst();
//inicio el ciclo while y extraigo el folio
while(IdFolioNota.next()){
//asigno el folio generado a un string llamado folio nota
FolioNota = IdFolioNota.getString(1);

}

//guardo el detalle que capture previamente 
ModeloDetalleVenta = (DefaultTableModel)tblDetalleVenta.getModel();

int nr = tblDetalleVenta.getRowCount();
for(int rventas = 0;rventas < nr;rventas++){
PreparedStatement pstDetalleVenta = cn.prepareStatement("Insert into DETALLE_NOTASVENTA(N_ALMACEN,FOLIO_NOTA,ID_ART,MODELO,MATERIAL,VARIEDAD,TALLA,PRECIO,CANTIDAD,IMPORTE_TOTAL,BARCODE)values(?,?,?,?,?,?,?,?,?,?,?)");
pstDetalleVenta.setString(1,NumeroAlmacen);
pstDetalleVenta.setString(2,FolioNota);
pstDetalleVenta.setString(3, (String)ModeloDetalleVenta.getValueAt(rventas,0));
pstDetalleVenta.setString(4, (String)ModeloDetalleVenta.getValueAt(rventas,1));
pstDetalleVenta.setString(5, (String)ModeloDetalleVenta.getValueAt(rventas,2));
pstDetalleVenta.setString(6, (String)ModeloDetalleVenta.getValueAt(rventas,3));
pstDetalleVenta.setString(7, (String)ModeloDetalleVenta.getValueAt(rventas,4));
pstDetalleVenta.setString(8, String.valueOf(ModeloDetalleVenta.getValueAt(rventas,6).toString()));
pstDetalleVenta.setString(9, (String)ModeloDetalleVenta.getValueAt(rventas,7));
pstDetalleVenta.setString(10, String.valueOf(ModeloDetalleVenta.getValueAt(rventas,8).toString()));
pstDetalleVenta.setString(11, (String)ModeloDetalleVenta.getValueAt(rventas,5));
pstDetalleVenta.executeUpdate();

}
ImprimirNota Imprimirnota = new ImprimirNota();
Imprimirnota.Imprimir(FolioNota);
JOptionPane.showMessageDialog(null,"Venta terminada Folio :" + FolioNota);
LimpiarFormulario();
OpenCashDrawer Open = new OpenCashDrawer();
Open.abrircajon();
Open.abrircajon();


}
catch(Exception e){
JOptionPane.showMessageDialog(null,e);
}


}
espero te hayas dado una idea clara de como podrias guardar y asignar tus folios , saludos
  #8 (permalink)  
Antiguo 16/06/2013, 07:48
 
Fecha de Ingreso: junio-2013
Mensajes: 12
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Problemas cuando dos personas registran datos al mismo tiempo en mi aplica

me parece interesante, como es eso, podrias explicarme algo mas detallado. gracias
  #9 (permalink)  
Antiguo 16/06/2013, 07:50
 
Fecha de Ingreso: junio-2013
Mensajes: 12
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Problemas cuando dos personas registran datos al mismo tiempo en mi aplica

Cita:
Iniciado por quilmes_05 Ver Mensaje
claramente es un problema de concurrencia,tendrías que sincronizar con semáforos o monitores.Cuando decís: coge el ultimo de la base de datos y le agrega un numero.toda esa parte mas la del guardado de ese numero en la base tiene que ser de manera atómica.
me parece interesante, como es eso, podrias explicarme algo mas detallado. gracias

Etiquetas: aplicacion, personas, tiempo
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 12:12.