[SOL] Bloqueo de tablas

(1/3) > >>

DickJunior:
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
LOCK TABLES MiTabla;
 
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
LOCK TABLES detalle;
 

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.

^Tifa^:
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.



DickJunior:
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.

^Tifa^:
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
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.

[u]nsigned:
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

Navegación

[0] Índice de Mensajes

[#] Página Siguiente