Autor Tema: Usuarios en MySQL  (Leído 3795 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Usuarios en MySQL
« en: Agosto 04, 2017, 10:40:06 am »
¡Hola!
Estoy teniendo algunos problemas con MySQL.
Tengo un sistema desarrollado en VB6 que corre en diferentes terminales y se conectan a una base de datos MySQL que está en una pc que hace de servidor.
Un usuario del sistema da de alta una venta, que inserta un registro en la tabla "ventas" y uno o varios en la tabla "detalleventa". La relación de ambas tablas es ventas.id = detalleventa.id_venta.
En general, todo va bien, pero a veces se da la siguiente situación:
Un usuario del sistema da de alta una venta normalmente. Luego, otro usuario del sistema da de alta otra venta. En esta segunda venta el registro en "ventas" se inserta correctamente, pero el registro de la tabla "detalleventa" se inserta con los datos de la venta anterior y no con los de la venta actual, con lo que, luego, al buscar la segunda venta, no se encuentra el detalle.

Ejemplo concreto:

Venta 1: un producto de 10 pesos.

Se insertan los siguientes registros:
Tabla "ventas":
id     fecha
1      2017-08-04

Tabla "detalleventas"
id     id_venta     importe
1      1               10

Venta 2: un producto de 20 pesos.

Se insertan los siguientes registros:
Tabla "ventas":
id     fecha
2      2017-08-04

Tabla "detalleventas"
id     id_venta     importe
2      1               10

Aquí se insertó en "detalleventas" nuevamente el registro de la venta anterior y no el de la venta actual.
Debiera ser así:

Tabla "detalleventas"
id     id_venta     importe
2      2               20

No sé por qué (no recuerdo si tenía una razón, realmente) en cada terminal donde se usa el sistema el usuario del sistema se conecta al servidor MySQL con el mismo usuario de MySQL. Quiero decir que los usuarios "Juan", "Pedro" y "Roberto", que tienen usuarios y claves diferentes para ingresar en el sistema, se conectan al servidor con el usuario "Usuario 1".
¿Será ese el motivo? ¿Debo hacer un usuario MySQL para cada usuario del sistema?
A lo mejor es una burrada lo que hice, pero hasta ahora no estaba teniendo problemas. No sé si se da ahora porque el servidor esté un poco más lento, o porque haya más usuarios conectados simultáneamente (alrededor de 10).
¿Se les ocurre qué puede ser?
¡Muchas gracias!

Jerónimo

obethermy

  • Megabyte
  • ***
  • Mensajes: 116
  • Reputación: +6/-7
    • Ver Perfil
Re:Usuarios en MySQL
« Respuesta #1 en: Agosto 05, 2017, 01:21:27 pm »
Asumiendo que ambas tablas, tienen un campo llamado id autonumérico y campo clave o primary key.
en el insert detalleventas este puesto en el campo id_venta el last_insert_id. Asi
insert into detalleventas(id_ventas,importe) values(last_insert_id,20);

Nota:
El uso de last_insert_id es de lo más sencillo y se puede utilizar a continuación de haber realizado la última inserción en la tabla de la que queramos el ID, en nuestro caso la tabla Aventuras. La ventaja de utilizar last_insert_id es que se utiliza dentro de la misma sesión abierta en MySQL, de manera que ese nuevo ID quedará guardado para utilizarse y será el mismo que devuelva la ya mencionada función last_insert_id.

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Usuarios en MySQL
« Respuesta #2 en: Agosto 07, 2017, 10:14:10 pm »
Hola, obethermy
Leyendo tu comentario advertí que omití algunos detalles de la situación. Perdón por ello.
Tal como observás, ambas tablas tienen un campo id autonumérico que es primary key.
Para realizar las inserciones abro una transacción en VB6. Sería algo así:
Código: (VB) [Seleccionar]
BD.BeginTrans
BD.Execute "INSERT INTO ventas (fecha, id_usuario, ...) VALUES (CURRENT_DATE(), " & IdUsuario & ", ...)"
Tabla.Open "SELECT id FROM ventas WHERE id_usuario = " & IdUsuario & " ORDER BY id DESC LIMIT 1", BD, adOpenStatic, adLockOptimistic 'Obtengo el dato más rápidamente que haciéndolo con "SELECT MAX(id)..."
idVenta = Tabla!id
Tabla.Close
BD.Execute "INSERT INTO detalleventas (id_venta, importe, ...) VALUES (" & idVenta & ", '" & Importe & "', ...)"
BD.CommitTrans
Teniendo en cuenta que lo hago con las transacciones entiendo que no debiera producirse el problema que comenté en el primer post, pero aun así sucede. ¿Estoy equivocado?
¿Haciéndolo con "last_insert_id" sería más seguro?
¿El hecho de que todos los usuarios del sistema utilicen el mismo usuario de MySQL no trae problemas?
Muchas gracias.

Jerónimo

obethermy

  • Megabyte
  • ***
  • Mensajes: 116
  • Reputación: +6/-7
    • Ver Perfil
Re:Usuarios en MySQL
« Respuesta #3 en: Agosto 08, 2017, 06:06:03 pm »
-Tu puedes usar el mismo usuario de mysql tantas veces cosea segun limite de mysql y sus privilegios.
- Para una consulta select es mejor usar , adOpenForwardOnly, adLockReadOnly es mas ligero. Si solo vas a listar la tabla.
-  last_insert_id es confiable.
Estas en modo multiusuarios siempre es bueno probar el sistema en dos pc al mismo tiempo en esas tablas.


Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Usuarios en MySQL
« Respuesta #4 en: Agosto 09, 2017, 08:53:03 am »
Excelente. Lo voy a probar así.
¡Muchas gracias!

Jerónimo

obethermy

  • Megabyte
  • ***
  • Mensajes: 116
  • Reputación: +6/-7
    • Ver Perfil
Re:Usuarios en MySQL
« Respuesta #5 en: Agosto 09, 2017, 11:35:23 am »
Si no te funciona y queda igual.
Es que estas usando un insert directo a mysql. En vez de addnew el cual si captura el ultimo insert realizado. Ya que estas haciendo un insert es poca la diferencia.
A menos que uses disco duros ssd lo cual te garantiza solo 2.5x de velicidad en escrituras o sea un insert que tarde 8.47sec tardara 3.27sec en una prueva que hice en discos ssd de 500mb/s de transferencia.