• Sábado 14 de Diciembre de 2024, 20:52

Autor Tema:  Bloquear Registros  (Leído 3061 veces)

kekal

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
Bloquear Registros
« en: Miércoles 7 de Septiembre de 2005, 17:13 »
0
Hola, un pregunta ....
tengo una aplicación en la que algunas tablas los usuarios hacen Altas/bajas y modificaciones el problema cae en que dos usuarios intenten hacer una modificación del mismo registro en una tabla.
hay alguna forma de bloquear los registros en una tabla? y se puede detectar? (para mandar un mensaje "registro en uso por otro usuario")

Por cierto (e importante) uso una base de datos de access

Si alguien puede dar un poco de luz al problema
gracias

mumo

  • Miembro activo
  • **
  • Mensajes: 66
    • Ver Perfil
Re: Bloquear Registros
« Respuesta #1 en: Sábado 10 de Septiembre de 2005, 15:18 »
0
mire estimado (a)

he hecho la misma pregunta en todas partes y nadie cacha, pero lo solucione de una forma muy basica, ya que lo que queria era bloquear  un reg. cuando estubiera trabajando con el, y que los demas usuarios pudieran verlo. encontre varias instrucciones para agregar en una consulta SQL, pero no me sirve,
asi que lo que hice fue crear una tabla de bloqueos y el primero que tome el registro queda grabado en esa tabla, el usuario y el registro, asi cualquiera que quiera acceder al reg. ya tomado primero verifico la tabla, si no esta permite de lo contrario envio un mensaje en pantalla de bloqueado y solo permito que vea los datos.

no se si hay alguna instruccion en c++ builder que permita bloquear los reg. pero seguire buscando para mejorar la forma de bloqueos.

kekal

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
Re: Bloquear Registros
« Respuesta #2 en: Domingo 11 de Septiembre de 2005, 21:31 »
0
Hola, mummo
Por lo que averigue la base de datos de access no permite bloqueos con lo cual es una putada tu solución es viable, yo habia hecho algo parecido creando campos llamados enuso tipo numerico
si el campo es mayor a 0 (el numero del ususario) daba un mensaje "en uso por el usuario:"+AnsiString(x)
pero me parece que lo mejor va a ser pasarse a FireBird/Interbase

Saludos

mumo

  • Miembro activo
  • **
  • Mensajes: 66
    • Ver Perfil
Re: Bloquear Registros
« Respuesta #3 en: Lunes 12 de Septiembre de 2005, 15:39 »
0
no creo que el cambio de motor de bd resulte, creo que es mas bien un asunto de lenguaje de prog. yo ocupo sql server y no he dado con la solucion exacta, solo el parche que estoy usando.

Buildero

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Bloquear Registros
« Respuesta #4 en: Lunes 12 de Septiembre de 2005, 22:13 »
0
Que tal,

Hay mucho que se puede decir sobre la forma en cómo cada manejador de base de datos trabaja sobre los bloqueos.

Las bases de datos de sobremesa (Access, Paradox, DBase) utilizan técnicas de bloqueo diferentes.

Si nos trasladamos a Servidores de Bases de Datos (Interbase, Firebird, SQL Server),  las técnicas también son diferentes. De hecho aqui entran en juego las llamadas "Transacciones".

Si se esta pensando en accesar la base de datos en mas de una maquina lo ideal es trabajar con Servidores de Bases de Datos, ya que estos están preparados para este propósito, si lo que se pretende es trabajar en una sola maquina (ejecutar una sola intancia del programa), las bases de datos de sobremesa son una opción.

Les recomiendo un libro muy bueno (en español) que trata sobre el manejo de bases de datos en C++ Builder. Muy completo.

La cara oculta de C++ Builder

Saludos.

mumo

  • Miembro activo
  • **
  • Mensajes: 66
    • Ver Perfil
Re: Bloquear Registros
« Respuesta #5 en: Miércoles 14 de Septiembre de 2005, 21:35 »
0
el libro mencionado, no sirve, en ninguna parte explica acerca de como bloquear los registros.- si alguien tiene alguna idea, por favor comentela yo trabajo con
sql server y c++ builder

Buildero

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Bloquear Registros
« Respuesta #6 en: Miércoles 14 de Septiembre de 2005, 22:18 »
0
Citar
el libro mencionado, no sirve, en ninguna parte explica acerca de como bloquear los registros.- si alguien tiene alguna idea, por favor comentela yo trabajo con
sql server y c++ builder

Estimado mumo, es una pena leer mensajes como el tuyo...y te lo digo porque mi comentario esta basado en argumentos.

Si leiste un poco , te habras dado cuenta que en un servidor de base de datos entran en juego las transacciones.... dichas transacciones son las que se encargan de bloquear los registros dependiendo de como las configures.

Ahora si quieres hacerlo a la antigua, pues create un campo booleano o numerico que te sirva como bandera para indicarte si el registro esta bloqueado....solo que... ojo.... si tu aplicación se cuelga por alguna circunstancia y el campo se queda indicando que el registro esta bloqueado, la próxima vez que intentes modificar o accesar a el, tu programa te indicará que el registro esta siendo utilizado por otro "usuario" lo cual no es netamente cierto. Tendrás que actualizarlo a mano. Como veras esto tiene serias consecuencias.

Asi es que te recomiendo leer más acerca de las transacciones, verás que te sacan de muchos apuros.

Por ultimo en la pag. 133 de dicho libro puedes encontrar lo siguiente (por si no lo viste)

Citar
Registros de transacciones y bloqueos

¿Cómo logran los sistemas de gestión de bases de datos que dos transacciones concurrentes no se estorben entre sí? La mayor parte de los sistemas, cuya arquitectura está basada en el arquetípico System R, utilizan técnicas basadas en bloqueos. Más adelante, al estudiar cómo se actualizan registros con C++ Builder, descubriremos que Paradox y dBase utilizan también bloqueos para garantizar el acceso exclusivo a registros, implementando un control de concurrencia pesimista . Sin embargo, aunque también se trata de “bloqueos”, el significado de los mismos es bastante diferente al que tienen en los sistemas SQL. Ahora veremos solamente cómo se adapta este mecanismo de sincronización a la implementación de transacciones.

En primer lugar, ¿cómo evitar las “lecturas sucias”? Existen dos técnicas básicas. La
más sencilla consiste en “marcar” el registro que modifica una transacción como
“sucio”, hasta que la transacción confirme o anule sus grabaciones. A esta marca es
lo que se le llama “bloqueo”. Si otra transacción intenta leer el valor del registro, se le hace esperar hasta que desaparezca la marca sobre el registro. Por supuesto, esta política se basa en un comportamiento “decente” por parte de las transacciones que modifican registros: no deben dejarse cambios sin confirmar o anular por períodos de tiempo prolongados.

Ahora bien, ¿cómo es que la transacción que realiza el cambio restaura el valor original del registro si se decide su anulación? Lo más frecuente, en los sistemas inspirados por System R, es encontrar implementaciones basadas en registros de transacciones (transaction logs). Estos registros de transacciones son ficheros en los cuales se graban secuencialmente las operaciones necesarias para deshacer las transacciones no terminadas.

Algunos guardan en el log el valor original; otros, por el contrario, guardan el
nuevo valor no confirmado, y lo transfieren a la base de datos solamente al confirmarse la transacción. En la teoría de bases de datos, hablaríamos de undo y redo logs (registros para deshacer o rehacer). Cada técnica tiene sus ventajas y desventajas: por ejemplo, si se utiliza un registro de rehacer y alguien corta la corriente, la base de datos no queda afectada, y al volver a encender el sistema podemos seguir trabajando sobre un estado consistente. Sin embargo, la aplicación de los cambios durante la confirmación es sumamente peligrosa, y el implementador debe tomar precauciones extraordinarias.

Esto nos da una idea para otra política de acceso: si una aplicación, al intentar leer un registro, encuentra que ha sido modificado, puede ir a buscar el valor original. Si utilizamos un redo log, el valor es el que se encuentra dentro del propio registro. En caso contrario, hay que buscarlo en el registro de transacciones. Por supuesto, esta técnica es superior a la anterior, pues ofrece mejores tiempos de acceso incluso en caso de modificaciones frecuentes.

Paradox y dBase implementan un undo log, pero cuando una aplicación lee un registro modificado por otra transacción, no se toma la molestia de buscar el valor
original en el log file. Por este motivo es que aparecen lecturas sucias.

Todos los bloqueos impuestos por una transacción, por supuesto, son liberados al
terminar ésta, ya sea confirmando o anulando.


mumo

  • Miembro activo
  • **
  • Mensajes: 66
    • Ver Perfil
Re: Bloquear Registros
« Respuesta #7 en: Jueves 15 de Septiembre de 2005, 16:03 »
0
Estimado Buildero, por lo visto le gusta mucho leer. pero la teoria no sirve si no hay practica, si muestras un ejemplo practico que sirva te creo, yo he probado antes de escribir en el foro el tema de transacciones y no sirve, quiza el error es mio, no lo se, pero no puedo darte la razon, ya que la teoria aguanta de todo, ej:
"la vacas vuelan".