Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MySQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-06-2007
Avatar de flystar
flystar flystar is offline
Miembro
 
Registrado: jul 2006
Posts: 184
Poder: 18
flystar Va por buen camino
Unhappy Como bloquear un registro de una tabla que esta en la red?

Buenos Días:

Solicito orientación o ayuda a alguna alma caritativa sobre lo siguiente lo cual me parece un asunto básico en un sistema de BD en red.

- Vamos a suponer que tenemos 3 computadoras, una de ellas tienen una base de datos MYSQL y las otras dos deberan accesar a esa misma BD para consultarla o modificarla y es posible que lo hagan al mismo tiempo.

- Imaginemos que una de las computadoras accesa la BD para modificar un registro, vamos a suponer que sea el registro No. 3 y DESPUES la otra computadora intenta modificar ese mismo registro.

- Lo mas usual que se me ocurre es que ese registro debe permanecer bloqueado hasta que la primera computadora acabe de modificarlo para que asi la otra computadora tome en cuenta que no puede modificar ese registro por que otra ya lo esta cambiando y entonces evitamos una serie de problemas.

- Mi pregunta es... como logro ese bloqueo??? En Delphi me imagino que en cada computadora que no es la que tiene la BD se crea como una copia en memoria de la BD y de esa manera probablemente cuando se intentan modificar el mismo registro al mismo tiempo no marca error por que cada una esta trabajando sobre su copia virtual. Asi sera????

- Una propuesta que se me ocurre es poner un campo que se llame "MeEstanUsando" y ponerle un "SI" si alguien la va a modificar y entonces cuando alguien mas intente modificar el mismo registro primero se debe verificar que el campo "MeEstanUsando" no tenga un "SI" y si no es asi entonces si puede modificarse.. un metodo medio rustico.. supongo que MYSQL tiene una funcion mas acertada para esto, o tal vez Delphi la tenga.

- Me doy a entender???? Gracias por su apoyo.
__________________

"Los unicos que no se equivocan son aquellos que no intentan hacer algo."
Iván Caballero Cano...
ivanhalen77@gmail.com
Responder Con Cita
  #2  
Antiguo 20-06-2007
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 22
Mick Va por buen camino
La modificacion de registros es inmediata, no mas de unos pocos milisegundos, asi que primero se realiza una modificacion y despues va la otra.

Otra cosa muy distinta es la edicion de un registro, y ahi la base de datos no tienen nada que decir, ni se entera, esta edicion no tienen nada que ver con el servidor de base de datos, solo en el momento de darle al boton "Guardar" o "Enviar" o como se llame, se envia la sentencia insert o update al servidor.

Si lo que pretendes es que mientras un usuario esta modificando una ficha, el registro correspondiente de la base de datos este bloqueado, eso no
es aconsejable hacerlo (salvo en aplicaciones o casos muy especificos y especiales), porque ante un apagado incorrecto o bloqueo de un ordenador cliente, o que el usuario se olvide y se vaya a tomar un cafe, el registro quedaria bloqueado durante mucho tiempo o de forma indefinida.

Lo que se suele hacer, si es necesario, es detectar en el momento de pulsar "Guardar" si el registro que vamos a grabar ha sido modificado en la base de datos y en ese caso se puede avisar al cliente, para que tome la opcion que corresponda.

Saludos
Responder Con Cita
  #3  
Antiguo 20-06-2007
Avatar de flystar
flystar flystar is offline
Miembro
 
Registrado: jul 2006
Posts: 184
Poder: 18
flystar Va por buen camino
Hola Mick:

Gracias por tu respuesta MIck:

Tienes la razón en que modificar no es lo mismo que editar, a veces por no usar la palabra correcta la pregunta ya cambia su sentido.

En ocaciones Mick, no es bueno que alguien pueda editar un registro que esta siendo cambiado por otra persona por que puede ocacionar un problema grave.

Ejemplo: Alguien edita un registro que decia "El paquete no ha llegado y urge recogerlo, es de vital importancia tenerlo" y lo modifica asi: "ya no es necesario ir hasta el Aeropuerto por que ya llego el paquete y nos ahorramos gasolina y tiempo, que bueno!!", pero en ese momento alguien se pone a modificar ese mismo registro y no se entera que el "paquete" ya llego a la oficina y por lo tanto, el coloca "Señor Mensajero por favor urge ir a recoger el paquete al aeropuerto por que todavia no llega, cualquier error significa perder al cliente por el tiempo que tenemos", y entonces el mensajero despues de todo esto checa ese registro y el lee que tiene que ir por el paquete, pero por la forma como se modifico el registro el no sabe que el paquete ya llego realmente y saldra a dar un vuelta al aeropuerto en vano perdiendo seguramente al cliente.

En el caso que tu explicas o propones que funciones tiene MYSQL para detectar que el registro que se intenta modificar fue cambiado un poco antes de que se apruebe la modificacion en la BD por parte del usuario???

Saludos, alguna otra idea?
__________________

"Los unicos que no se equivocan son aquellos que no intentan hacer algo."
Iván Caballero Cano...
ivanhalen77@gmail.com
Responder Con Cita
  #4  
Antiguo 20-06-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por flystar
En el caso que tu explicas o propones que funciones tiene MYSQL para detectar que el registro que se intenta modificar fue cambiado un poco antes de que se apruebe la modificacion en la BD por parte del usuario???
Lo que puedes hacer es colocar un campo TIMESTAMP en tu tabla que indique la última hora de grabado. Tu aplicación, cuando quiera editar un registro, toma nota de esa hora. Al momento de guardar, antes lee el valor actual de ese campo. Si coincide con el que tiene anotado, quiere decir que nadie más ha modificado ese registro y guarda entonces sí, la información actualizada, incluyendo la hora actual. Si, por el contrario, la hora almacenada en la tabla difiere de la anotada, es porque alguien más ya cambió los datos. Es ahí donde el usuario debe decidir qué hacer, si cancelar sus cambios o sobreescribir los que alguien más hizo.

// Saludos
Responder Con Cita
  #5  
Antiguo 20-06-2007
Avatar de flystar
flystar flystar is offline
Miembro
 
Registrado: jul 2006
Posts: 184
Poder: 18
flystar Va por buen camino
OK Eso es una buena idea Roman, la voy a considerar en forma seria y probablemente asi lo haga pero:

Aun asi me sigo quedando con la duda de que funciones tiene MYSQL para poder bloquear un registro que esta siendo editado por algun usuario, conocen cuales son y una explicación práctica de como se usan esas funciones en un ejemplo sencillo?

Muy amables, gracias por su apoyo. UNIDOS HACEMOS MAS!
__________________

"Los unicos que no se equivocan son aquellos que no intentan hacer algo."
Iván Caballero Cano...
ivanhalen77@gmail.com
Responder Con Cita
  #6  
Antiguo 20-06-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
La idea no es mía, es lo que se conoce como bloqueo optmista y es una forma de hacer lo que Mick te comentó antes.

En MySQL, puedes sólo hacer bloqueos de tablas (o sea, bloqueas toda la tabla), a no ser que uses tablas innodb, con las cuales puedes hacer bloqueos a nivel de registro, pero este tipo de tablas son más lentas que las tablas myisam, si bien son imprescindibles para el manejo de transacciones.

De todas formas, no te olvides de lo que ya te mencionó Mick, en cuanto a que no es aconsejable el uso de bloqueos.

// Saludos
Responder Con Cita
  #7  
Antiguo 20-06-2007
Avatar de flystar
flystar flystar is offline
Miembro
 
Registrado: jul 2006
Posts: 184
Poder: 18
flystar Va por buen camino
OK Roman. Lo voy a tomar en cuenta.

Por lo que veo tambien tendré que pensar en la forma de que sea poco probable que alguien se ponga a editar el mismo registro que otra persona ya esta editando para evitar alguna confucion en la informacion.
La verdad es que esto se trata de hacer un sistemita de telemarketing donde habra una base de datos con las personas a llamar y su telefono y como habra 3 computadoras el sistema le debe ir marcando a cada quien que telefono deben marcar tratando de que nunca marquen a la misma persona por que entonces se crea un problema de estarle hablando a la misma persona y es perdida de tiempo y confucion. Por eso necesita que no fuera posible editar el mismo registro. Aunque eso es algo basico en cualquier sistema de red con una sola BD donde la accesaran entre varios.

Me pregunto si la Arquitectura Cliente/Servidor de Delphi y sus componentes referentes a esto tendran la misma forma de funcionar que dices a la hora de editar un mismo registro. Sera?

Como sea, agradesco su apoyo, 3 cabezas siempre piensan mejor que una.
Quedo a sus ordenes para lo que les pueda apoyar.
__________________

"Los unicos que no se equivocan son aquellos que no intentan hacer algo."
Iván Caballero Cano...
ivanhalen77@gmail.com
Responder Con Cita
  #8  
Antiguo 21-06-2007
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 22
Mick Va por buen camino
Pensando en lo que pretendes hacer, el problema no se debe al uso de bloqueos sino a que el diseño de la base de datos no es el adecuado.
Es decir si mucha gente va a poder añadir en cualquier momento "anotaciones", estas no deberian ir todas juntas en un mismo camo memo.
Sino que lo logico seria tener una tabla de anotaciones, en la que cada registro es una anotacion individual.
Asi que si dos personas añaden 2 anotaciones, pues aparecerian dos registros,
con lo que no habria confusion posible, ademas asi se podria guarda de una forma sencilla, la fecha y hora de cada anotacion y el usuario que las ha hecho.
Ademas permite mucha mas flexibilidad en cuanto a la seguridad del sistema, porque se podria evitar si se quisiese que un usuario "borrase" o alterase anotaciones realizadas por otro usuarios. O incluso llevado al extremo evitar que un usuario elimine las anotaciones propias XD, en realidad esto no es tan extremo, es muy comun, para evitar que un usuario pueda eliminar o alterar alguna anotacion suya y se desdiga de lo que haya anotado .

Saludos
Responder Con Cita
  #9  
Antiguo 21-06-2007
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 22
Mick Va por buen camino
En cuanto a la forma de detectar registros modificados los componetes TQuery de base de datos de delphi ya tienen en cuenta eso, y existe la propiedad UpdateMode, para poder elegir que metodo utilizar para localizar los registros a modificar, y da 3 opciones:

upWhereAll
* All columns (fields) are used to locate the record.
upWhereChanged
* Only key field values and the original value of fields that have changed are used to find the record.
upWhereKeyOnly
* Only key fields are used to find the record.

La opcion elegida hace que se construya la clausula WHERE de las sentencias UPDATE de forma distinta.

Supongamos que tenemos un registro con los siguientes valores leidos previamente: ID=1 , NOMBRE='JOSE', TELEFONO='9001111110' y queremos modificarlo, pues tenemos 3 formas que son las siguientes:

* upWhereKeyOnly, seria asi:

UPDATE AGENDA SET NOMBRE='PEPE' WHERE ID=1

En este caso solo usamos la clave primaria en el WHERE y nunca se detectara si el registro ha sido modificado previamente (esta forma es la upWhereKeyOnly) y se sobreescribira cualquier modificacion previa:

* upWhereChanged, seria asi:

UPDATE AGENDA SET NOMBRE='PEPE' WHERE ID=1 AND NOMBRE='JOSE'

En este caso si el campo NOMBRE ha sido modificado por otro usuario, la setencia update no modificara el registro ya que no se cumplira que NOMBRE='JOSE'. En definitiva los campos que hayamos modificado deben ponerse en la sentencia where con los valores antiguos que se supone que deberian tener en la base de datos.

* upWhereAll, seria asi:

UPDATE AGENDA set NOMBRE='PEPE' WHERE ID=1 AND NOMBRE='JOSE' AND TELEFONO='9001111110'

Con este metodo evitamos que el registro sea modificado incluso si cualquier campo que nosotros no hemos modificado ha sido cambiado previamente, ya que incluimos en el where TODOS los valores de todos los campos del registro, incluidos aquellos que no hemos modificado.

La eleccion del metodo de actualizacion dependera de cada tabla e incluso de cada campo a modificar, es una cosa que habra que elegir en funcion del significado de la informacion.

De modo que si los campos de una tabla son independientes entre si podria interesarnos que los usuarios puedan estar modificando el mismo registro a la vez siempre y cuando modifiquen distintos campos (en ese caso utilizariamos el metodo upWhereChanged).

En cambio en otras tablas puede ser importante usar el upWhereAll para que realmente solo un usuario pueda modificar el mismo registro en un determinado instante.

Saludos

Última edición por Mick fecha: 21-06-2007 a las 02:59:45.
Responder Con Cita
  #10  
Antiguo 21-06-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Una discusión acerca del uso de UpdateMode y el uso de TimeStamp, puede verse en el artículo La cuarta opción de Ian Marteens.

// Saludos
Responder Con Cita
  #11  
Antiguo 27-07-2008
jcarlos.matrix jcarlos.matrix is offline
Miembro
 
Registrado: may 2005
Ubicación: ensenada b.c.
Posts: 18
Poder: 0
jcarlos.matrix Va por buen camino
Post

creo que lo que deberias de hacer es crear una tabla de status con fecha y hora por cada paquete o registro, compra de un cliente.
__________________
Se un buen lector y que la fuerza te acompañe
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Cómo bloquear una tabla ? santi33a MS SQL Server 1 12-04-2006 15:02:34
Como bloquear un registro!!! CarlosHernandez Firebird e Interbase 7 12-08-2005 16:49:50
Como se podría bloquear un registro marcial Conexión con bases de datos 4 17-02-2004 22:00:42
como bloquear un registro en un dbgrid marcelofabiani Conexión con bases de datos 5 02-10-2003 21:04:01
Como bloquear la tabla, para escritura? judoboy Conexión con bases de datos 2 21-05-2003 10:02:48


La franja horaria es GMT +2. Ahora son las 22:25:59.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi