Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Problema cuando varios usuarios modifican el mismo registro en base de datos

Estas en el tema de Problema cuando varios usuarios modifican el mismo registro en base de datos en el foro de Visual Basic clásico en Foros del Web. Como puedo hacer para modificar registros en un entorno multiusuario por que si dos usuarios modifican el mismo registro atravez de su primary key se ...
  #1 (permalink)  
Antiguo 23/10/2009, 17:15
 
Fecha de Ingreso: septiembre-2009
Mensajes: 73
Antigüedad: 14 años, 7 meses
Puntos: 0
Problema cuando varios usuarios modifican el mismo registro en base de datos

Como puedo hacer para modificar registros en un entorno multiusuario por que si dos usuarios modifican el mismo registro atravez de su primary key se genera un error, que se debe hacer en este caso, acudo a su experiencia
  #2 (permalink)  
Antiguo 23/10/2009, 20:23
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Problema cuando varios usuarios modifican el mismo registro en base de dat

Mensaje trasladado a un nuevo tema desde:
http://www.forosdelweb.com/f69/aplic...suario-688203/

Saludos.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 23/10/2009, 20:36
Avatar de culd  
Fecha de Ingreso: noviembre-2003
Mensajes: 959
Antigüedad: 20 años, 5 meses
Puntos: 19
Respuesta: Problema cuando varios usuarios modifican el mismo registro en base de dat

Cita:
Iniciado por xDriver Ver Mensaje
Como puedo hacer para modificar registros en un entorno multiusuario por que si dos usuarios modifican el mismo registro atravez de su primary key se genera un error, que se debe hacer en este caso, acudo a su experiencia
Depende el motor que uses...

Pero el tema esta en el "acerrojo" que estas usando para crear el insert...

Los tipos de cerradura que tenes son:
adLockBatchOptimistic
adLockOptimistic
adLockPessimistic
adLockReadOnly

En tu caso usa "adLockOptimistic" para que al momento de utilizar la tabla nadie mas la use, es decir que simultaneamente no van a poder otras conexiones utilizarle ni para lectura ni para escritura hasta que termine de procesar, una vez que termino de procesar ahi libera para la siguiente peticion a esa tabla.

Te quedaria algo asi:
Código vb:
Ver original
  1. turecorset.Open "INSERT INTO blablabvla", tuconexion, adOpenDynamic, adLockPessimistic
  #4 (permalink)  
Antiguo 23/10/2009, 20:59
 
Fecha de Ingreso: septiembre-2009
Mensajes: 73
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Problema cuando varios usuarios modifican el mismo registro en base de dat

Hola, segun tu propuesta seria el mismo tipo cerrojo para actualizar los registros pero en mi caso utilizo rs.AddNew y rs.Update, ademas de cargar los registros en un grid asi:

Set rs = New Recordset
rs.Open "SELECT campo1,campo2 FROM tabla", cn, adOpenStatic, adLockPessimistic
Set Grid1.DataSource = rs

Que puedo hacer?, o me recomiendas mudar mi codigo de la forma como lo propones, gracias por la ayuda.

Última edición por xDriver; 23/10/2009 a las 21:24
  #5 (permalink)  
Antiguo 24/10/2009, 01:23
Avatar de culd  
Fecha de Ingreso: noviembre-2003
Mensajes: 959
Antigüedad: 20 años, 5 meses
Puntos: 19
Respuesta: Problema cuando varios usuarios modifican el mismo registro en base de dat

Cita:
Iniciado por xDriver Ver Mensaje
Hola, segun tu propuesta seria el mismo tipo cerrojo para actualizar los registros pero en mi caso utilizo rs.AddNew y rs.Update, ademas de cargar los registros en un grid asi:

Set rs = New Recordset
rs.Open "SELECT campo1,campo2 FROM tabla", cn, adOpenStatic, adLockPessimistic
Set Grid1.DataSource = rs

Que puedo hacer?, o me recomiendas mudar mi codigo de la forma como lo propones, gracias por la ayuda.
Pera, la base seguro es Access no?...

Si es access lee el post que le conteste al otro flaco que puso el link David.

Te combiene laburar con una base de datos del tipo cliente/servidor, te recomiendo MySQL por que tenes soporte por todos lados...

No esta mal usar recorser.AddNew pero no es optimo, eso esta bien para aprender, pero los insert se usan directamente con "INSERT" de SQL y los update con "UPDATE" de SQL... Eso es mas rapido y evita errores.

Pero si, en definitiva abrilo asi como te mostre de la forma que estas haciendo pero rapidamente tiene que procesar por que los demas "clientes" se van a saturar y traer problemas (si es que estas usando access)...

Ya te digo, cambia de base de datos y de forma de manejar la base busca el lenguaje ANSI SQL y ahi vas a entender mucho mejor
  #6 (permalink)  
Antiguo 24/10/2009, 12:58
 
Fecha de Ingreso: septiembre-2009
Mensajes: 73
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Problema cuando varios usuarios modifican el mismo registro en base de dat

Estoy utilizando mysql5.
Si utilizo el .addnew y .update me genera un error, pero si aplico las consultas sql directamente mediante el .open el problema no ocurre, asi que tendre que hacerlo de la forma correcta y olvidarme del addnew.
  #7 (permalink)  
Antiguo 24/10/2009, 13:03
 
Fecha de Ingreso: septiembre-2009
Mensajes: 73
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Problema cuando varios usuarios modifican el mismo registro en base de dat

Otra consulta, como controlar cuando ingreso registros en una tabla pedido cuyos campos pueden ser N_pedido, idProducto, otros_Campos.
Si la tabla pedido esta relacionada a la tabla Producto y antes de grabar los registros un usuario en otro punto elimina el idProducto que esta a segundos de ser grabado en la tabla pedido, me daria un error como se hace en esta situiacion?
  #8 (permalink)  
Antiguo 24/10/2009, 23:18
Avatar de culd  
Fecha de Ingreso: noviembre-2003
Mensajes: 959
Antigüedad: 20 años, 5 meses
Puntos: 19
Respuesta: Problema cuando varios usuarios modifican el mismo registro en base de dat

Cita:
Iniciado por xDriver Ver Mensaje
Otra consulta, como controlar cuando ingreso registros en una tabla pedido cuyos campos pueden ser N_pedido, idProducto, otros_Campos.
Si la tabla pedido esta relacionada a la tabla Producto y antes de grabar los registros un usuario en otro punto elimina el idProducto que esta a segundos de ser grabado en la tabla pedido, me daria un error como se hace en esta situiacion?
Eso seria un error de consistencia, mysql con varios tipos de tablas, es decir con formatos diferentes...

El tipo por default es la MYISAM despues tiene otro tipo llamado INNODB esta ultima es un poco mas lenta que la primera (pero solo cuando hay millones de registros y haces una filtrado exaustivo), en fin la ventaja que tiene INNODB es que podes crear llaves foreanas "FOREIGN KEY" y mantener una integridad referencial entonces de esa manera mientras que existan registros en "PEDIDOS" que llevan hacia algun "PRODUCTO" mysql no va a dejar que exista una modificacion y te devuelve un error...

Osea con eso evitas que te borren un registro y se genere un error, en cambio con MYISAM la consistencia de errores tenes que programarla vos directamente en tu aplicacion.

Quiero recalcar que una cosa es "PROGRAMAR" y otra cosa es "DISEÑO Y MODELADO DE BASE DE DATOS"... Osea, por que sepas poner un par de codigos en vb que lo buscaste por internet, no significa que vas a dominar el area de base de datos, en especial el lenguaje ANSI SQL... Para hacer bien las cosas hay que estudiar, en la universidad se aprende la base de cada cosa y despues tenes que ampliar tus conocimientos, pero si no conoces un motor no te metas a programar para ese motor por que tiene miles de cosas que no vas a conocer y el resultado final no va a ser muy optimo que digamos
  #9 (permalink)  
Antiguo 25/10/2009, 22:09
 
Fecha de Ingreso: septiembre-2009
Mensajes: 73
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Problema cuando varios usuarios modifican el mismo registro en base de dat

Hola, bueno de hecho si estudie en la uni y dudo mucho que alguien que no sepa sobre pk, fk integridad referencial pueda llegar a crear un sistema medianamente eficiente, ademas aprendi sql con sqlserver2000 y me parece que ahi no existe esto sobre MyISAM e INNODB sino que viene por defecto el INNODB por decirlo de alguna manera, por otro lado mi gran error fue no averiguar mas sobre mysql.

Volviendo a la pregunta asumiento que mi bd esta en INNODB(Para evitar este incoveniete por ahora estoy probando con sqlserver2000 donde si estan presenten las FK) me salta este error al ingresar un pedido cuando el articulo fue borrado seguntos antes por otro usuario del sistema
Código:
Error '-2147467259(80004005)' en tiempo de ejecucion
No se puede agregar o cambiar el registro porque se necesita un registro relaciona en la tabla 'Producto'
Logicamente no me va agregar el pedido debido al error de integridad referencial, como debo tratar el error desde vb6.0, ya que el idProduto todavia no esta grabado en la tabla pedido y es posible borrarlo desde otro punto.
  #10 (permalink)  
Antiguo 29/10/2009, 08:39
Avatar de culd  
Fecha de Ingreso: noviembre-2003
Mensajes: 959
Antigüedad: 20 años, 5 meses
Puntos: 19
Respuesta: Problema cuando varios usuarios modifican el mismo registro en base de dat

Código vb:
Ver original
  1. On Error GoTo error
  2.      'haces tu consulta
  3.     Exit Sub ó Exit Function
  4. error:
  5. Dim a as long
  6. If Err.Number <> 0
  7.      a = InStr(1, Err.Description, "No se puede agregar o cambiar el registro porque se necesita un registro relaciona en la tabla", vbTextCompare)
  8.      If a > 0 then
  9.           'Aca reconociste que salto ese error
  10.     End If
  11. End If

Te lo puse asi por que por lo general si mal no recuerdo siempre devuelve el mismo numero de error... Entonces mejor que busque por la descripcion del error.
  #11 (permalink)  
Antiguo 29/10/2009, 15:28
 
Fecha de Ingreso: septiembre-2009
Mensajes: 73
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Problema cuando varios usuarios modifican el mismo registro en base de dat

Si tienes razon p.e cuando la pk se repite tambien devuelve el mismo numero de error.
Entonces sugieres que controle la situacion capturando el error, he visto un par de sistemas en vb6.0 me parece que utilizan DAO y el control data y lo que hacen es impedir que el IdArticulo sea borrado aunque todavia no exista en la tabla pedido, no se como podria hacerlo de esa manera por que si intento capturar los errores tendria que capturar todos los posibles errores.
Por ultimo lo hare como mencionas, aunque que pasaria si llevo mi proyecto a una pc con vb6 ingles, tu sabes mas asi que seguire tu metodo.

saludos
  #12 (permalink)  
Antiguo 29/10/2009, 19:24
Avatar de culd  
Fecha de Ingreso: noviembre-2003
Mensajes: 959
Antigüedad: 20 años, 5 meses
Puntos: 19
Respuesta: Problema cuando varios usuarios modifican el mismo registro en base de dat

Cita:
Iniciado por xDriver Ver Mensaje
Si tienes razon p.e cuando la pk se repite tambien devuelve el mismo numero de error.
Entonces sugieres que controle la situacion capturando el error, he visto un par de sistemas en vb6.0 me parece que utilizan DAO y el control data y lo que hacen es impedir que el IdArticulo sea borrado aunque todavia no exista en la tabla pedido, no se como podria hacerlo de esa manera por que si intento capturar los errores tendria que capturar todos los posibles errores.
Por ultimo lo hare como mencionas, aunque que pasaria si llevo mi proyecto a una pc con vb6 ingles, tu sabes mas asi que seguire tu metodo.

saludos
Mira... Yo te diria que uses las cerraduras para que no se puedan modificar nada cuando tenes que hacer inserciones criticas... Y a la vez antes de hacer la insercion podes usar un select para verificar que exista el idarticulo...

Osea, yo lo plantearia asi mira...

Crea un procedimiento almacenado que tenga un select para verificar si existe el idarticulo, si existe mandale el insert que tenes que mandar... Vos desde vb llamas al procedimiento almacenado y verificas la respuesta del mismo (pero al llamarlo fijate que la cerradura sea para que nadie mas pueda acceder) con eso estas mas que seguro que no va a pasar ningun error, por que si no existe el idarticulo te va a devolver false
  #13 (permalink)  
Antiguo 30/10/2009, 11:18
 
Fecha de Ingreso: septiembre-2009
Mensajes: 73
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Problema cuando varios usuarios modifican el mismo registro en base de dat

Realizar un select antes del insert me parece lo mejor y con sp mejor aun.
En anteriores respuestas mencionaste la inconsistencia y leyendo un poco encontre el ACID Compliant y me falta un golpe para poder aplicarlo.

Como podria aplicar la atomicidad desde vb.
Ejemplo de wikipedia: si intento hacer 2 consultas, restar 10 a B y añadir 10 a A, si ambas consultas se ejecutan esta ok, pero si una de ellas falla entonces biene el problema, por logica la solucion seria intentar ejecutar el sql que falta ó deshacer lo que se hizo.

Que hago en esta situacion, como podria capturar el error, digamos q en caso de un corte de energia solo realiza la 1era consulta y en una relacion maestro detalle un fallo asi causaria inconsistencia en la db, que se debe hacer?
Como saber si las 2 consultas o si solo 1 se realizo con exito y si se da el caso volver a intentar o deshacer dichas operaciones.
  #14 (permalink)  
Antiguo 30/10/2009, 18:52
 
Fecha de Ingreso: septiembre-2009
Mensajes: 73
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Problema cuando varios usuarios modifican el mismo registro en base de dat

Encontre que debo utilizar BEGIN TRAN y COMMIT TRAN para ejecutar varias consultas en una sola transaccion y cuando alguna consulta no se ejecute utilizar ROLLBACK TRANSACTION, parece que con eso se soluciona, saludos

Última edición por xDriver; 02/11/2009 a las 16:38
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 01:09.