elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  Bases de Datos (Moderador: Carloswaldo)
| | | |-+  [SOL] Bloqueo de tablas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [SOL] Bloqueo de tablas  (Leído 13,963 veces)
DickJunior

Desconectado Desconectado

Mensajes: 10


Ver Perfil
[SOL] Bloqueo de tablas
« en: 2 Diciembre 2009, 22:50 pm »

Hola, estuve buscando sobre como bloquear registros en Mysql ... buscando en internet me tope con la sentencia LOCK, al parecer con esta funcion se bloquea una tabla, la sintaxis es la siguiente (para esto el autocommit esta en 0):
Código
  1. LOCK TABLES MiTabla;
  2.  
Habiendo ejecutado el codigo ... si intento hacer una insercion me dira que no se puede porque la tabla esta bloqueada.

Todo funciona correcto ( tanto desde la shell asi como el phpmyadmin ). Ahora viene el detalle, no se como hacer esto funcional ... mmm ... me explico:

Tengo una pagina (tabla.php) en Php que accede a la tabla detalle para ver su estructura, cuando un usuario entra a esta pagina (tabla.php) podra agregar/quitar/modificar campos, es en ese momento cuando la tabla se debe bloquear ( de esa forma si otro usuario quisiera agregar/modificar/eliminar campos de la misma tabla, no podra hacerlo ).

Cuando ingreso a la pagina (tabla.php) en cuestion ejecuto la instruccion:

Código
  1. LOCK TABLES detalle;
  2.  

Supuestamente la tabla deberia estar bloqueada, pero esto no es asi, porque cuando entro al php  y/o desde la misma shell si se puede eliminar un campo de la tabla detalle.

Sigo buscando pero aun no encuentro solucion al problema. Gracias de ante mano y saludos.


« Última modificación: 4 Diciembre 2009, 18:33 pm por DickJunior » En línea

^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: Bloqueo de tablas
« Respuesta #1 en: 3 Diciembre 2009, 01:32 am »

Hola.

Puedes activar dicho mandamiento con :

LOCK TABLE nombre_tabla  WRITE;

dicho mandamiento permite que el usuario que Lockeo la tabla en escritura sea el unico que en su sección tenga capacidad de escritura/lectura en la tabla en cuestion, hasta que ese usuario libere el lockeo de la tabla con UNLOCK TABLES;

Si otro usuario inicia sesion y intenta actualizar/modificar/etc la misma tabla mientras esta lockeada por otro usuario en su session, la consulta se quedara en espera hasta que sea liberado el lock por el usuario que lo genero inicialmente, ya liberado la consulta en espera sera realizada.





En línea

DickJunior

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: Bloqueo de tablas
« Respuesta #2 en: 3 Diciembre 2009, 01:55 am »

Si todo OK ... pero todo esto es funcional desde el php ¿? Funcionara desde la pagina ?  porque cuando ejecuto desde el phpmyadmin si funciona (pero todo en la misma consulta)... si hago una linea por consulta el bloqueo no sirve.
En línea

^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: Bloqueo de tablas
« Respuesta #3 en: 3 Diciembre 2009, 02:24 am »

Supongo que te refieres a si es funcional en PHP puesto que cuando preparas una consulta con el API de MySQL en PHP haces 1 sola peticion....

No hagas en el codigo PHP consultas divididas, puedes incluir todo lo que quieres en 1 sola consulta, mas o menos asi:

Código
  1. LOCK TABLE tabla WRITE; INSERT INTO tabla VALUES('algo'); UNLOCK TABLES;

Asi se lanzarian en 1 sola consulta 3 juntas. (Puedes probarlo via shell para que veas como funciona) pero ten la constancia que esto solo lockeara la tabla en fracion de milisegundos, (solamente hasta que se inserte o actualize o se cumpla la consulta que va en el medio de lock tables y unlock tables) seguido termine la consulta se desbloqueara la tabla, esto aunque funcione yo no te lo recomendaria, ya que haria constantes lockeos y desbloqueos de tablas en el motor muchas veces por fraciones de milisegundos. Solamente si estas seguro que es un area que no sera muy concurrente en modificaciones, podrias aplicar la peticion de la manera anterior o podrias (Aunque no se si existe en PHP) aplicar un HERE DOCUMENT dentro de tu codigo.

Pero de poderse se puede tu peticion.
En línea

[u]nsigned


Desconectado Desconectado

Mensajes: 2.397

JS/Node developer


Ver Perfil WWW
Re: Bloqueo de tablas
« Respuesta #4 en: 3 Diciembre 2009, 02:38 am »

Pero eso no seria una opciona a usar en un script php (web), por qué..bueno, corrijanme si me equivoco, pero:

El script sera siempre el mismo, asi que supongamos que un navegante A ejecuta el scrit y bloquea la tabla como ha dicho tifa, supongamos que el script abre la conexion con mysql_connect("localhost","root","xxxxxx");e inmediatamente otro user B ejecuta el script php (siempre via web)... da lo mismo si la tabla esta lockeada o no, si al fin y al cabo el script siempre hace la conexión con el mismo user..es correcto eso?  :-X

Saludos
En línea

No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!
^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: Bloqueo de tablas
« Respuesta #5 en: 3 Diciembre 2009, 02:51 am »

Si efectivamente eso es correcto. (aunque no se nada sobre PHP).

Recuerda  ❶ que en el CPU como tal nada (aunque digan que es multitarea y corre 2 procesos a la vez) nada, realmente ejecuta 2 procesos a la vez (Por eso se ha creado semaforos, memoria compartida, colas, etc, etc), asi  mismo ocurre en el motor de base de datos, la diferencia de ejecucion de una consulta u otra se diferenciaran por fraciones de milisegundos (nanosegundos en este caso, estan en cache de memoria).

Pero yo particularmente, no recomendaria esto por la masivas lockeos y deslockeos en fraciones de nanosegundos por una consulta generada por usuarios, como ya habia expuesto.

PD: He supuesto que la conexión mediante el script no se hara siempre con el mismo usuario, ya que no tendria mucha logica lockear una tabla si se usa un unico usuario, el lockeo no aplicaria para este solo si es de lectura, esto sin contar que el mismo ha afirmado que lo prueba por shell y phpadmin y funciona, entonces supongo que no se refiere a un unico usuario.
« Última modificación: 3 Diciembre 2009, 02:55 am por ^TiFa^ » En línea

DickJunior

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: Bloqueo de tablas
« Respuesta #6 en: 3 Diciembre 2009, 02:58 am »

Enderezo mas la pregunta y voy al punto.

Supongamos que se tiene un sistema en el que tenemos entre muchas, 2 tablas (padre, hijo ... la relacion es de 1 a muchos) ... el usuario A ingresa al sistema y se dispone de registrar a un hijo, el formulario es parecido a esto:

<form>
 seleccione padre <select></select>
 nombre de hijo <input>
 ... (muchos campos mas)
</form>

Mientras que el usuario A selecciono el padre y se encuentra llenando los demas campos, un usuario B ingreso al sistema desde otra terminal y se le ocurrio eliminar al padre que el usuario A usaria para registrar un hijo.

Solucion : Cuando el usuario A seleccione el padre, el registro se debe bloquear de tal forma que nadie pueda tener acceso a el.

La idea es esa.
« Última modificación: 3 Diciembre 2009, 03:00 am por DickJunior » En línea

^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: Bloqueo de tablas
« Respuesta #7 en: 3 Diciembre 2009, 03:20 am »

Bueno DickJunior, segun lo expresado por ti finalmente, el ejemplo expresado por mi (realizar 3 peticiones en 1 sola consulta) no aplicaria para tu caso. No se como vaya en PHP (Si por cada consulta SQL realize conexión a la DB, preparar consulta, aplicar consulta y salir) porque si en PHP funciona de esta manera, aun lograras la manera de validar la sección de usuario y enviar un lock table, al finalizar la consulta se eliminaria de la cache de memoria y las tablas quedarian en unlock. La unica via de poder aplicar un lock table y que permanezca funcional como esperas que hagas, seria mantener una sección conectada en el motor DB sin deslogearse, poder llenar un formulario mientras tanto para finalmente, enviar 1 sola consulta:

Código
  1. INSERT INTO TABLA VALUES('algo'); UNLOCK TABLES;

Lamentablemente yo no se como PHP maneja las conexiones al motor de base de datos o como hacer una especie de memlock de PHP en el motor que permita que identifiques un usuario con una DB y se mantenga ahi en sección logeado hasta que llenes tu formulario y pulses enviar.

Espero de antemano, que en la sección PHP te clarifiquen si es posible esto dentro de PHP como tal, autentificar una consulta SQL y permanecer anclado al motor hasta que ocurra un evento en PHP.
En línea

DickJunior

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: Bloqueo de tablas
« Respuesta #8 en: 3 Diciembre 2009, 21:00 pm »

He pensando en implementar una tabla en la bd con los siguientes campos:

Citar
tabla concurrencia
 codigo int,
 tabla varchar(30),
 primary int,
 sesion varchar(30),
 tiempo timestap

La idea es que cuando un usuario A acceda a un registro de la tabla cliente (supongamos al cliente cuyo primary key sea CL01A01) se inserte en la tabla concurrencia los campos:

Citar
codigo que es el codigo autogenerado del registro
tabla que es en este caso cliente
primary que es en este caso CL01A01, el codigo del registro actual
session que es en este caso el id de la session del usuario A
tiempo que es en este caso la fecha y hora que se genero el registro

La idea es que si un usuario B quiera ingresar al modificar algun registro, antes debe buscarlo en la tabla concurrencia, si el codigto de registro que se quiere modificar esta en dicha tabla le mostrar un mensaje diciendole que otro usuario lo esta usando, pero sino tendra libre acceso a el.

Lo que aun no se como hacer es eliminar el registro de la tabla concurrencia en el caso que el usuario A cierre directamente el navegador. Que opinan sobre esto, es valido ?  es correcto?  es efectivo ?

Saludos.
En línea

DickJunior

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: Bloqueo de tablas
« Respuesta #9 en: 3 Diciembre 2009, 22:34 pm »

Editdo

Eliminar post.
« Última modificación: 3 Diciembre 2009, 22:45 pm por DickJunior » En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines