Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Bloquear base de datos

Estas en el tema de Bloquear base de datos en el foro de Mysql en Foros del Web. Buenas a todos. Corregirme si me equivoco: Los querys entran en orden en el motor de mysql, ejecutandose por orden y entonces tengo esta duda. ...
  #1 (permalink)  
Antiguo 04/07/2011, 08:37
Avatar de Chupytoloco  
Fecha de Ingreso: julio-2007
Mensajes: 88
Antigüedad: 13 años, 11 meses
Puntos: 1
Bloquear base de datos

Buenas a todos.

Corregirme si me equivoco:

Los querys entran en orden en el motor de mysql, ejecutandose por orden y entonces tengo esta duda.

Supongamos que muchos usuarios pueden ejecutar un script, dicho script se compone de:

Un select que comprueba si existe un campo
Un update en caso de que exista
Un delete para que nadie pueda volver a realizar la operacion con la misma condicion del select superior.

Como puedo hacer para que esas 3 cosas se hagan antes que cualquier otra cosa en la base de datos?, o dicho de otro modo, como bloqueo la base de datos hasta que el script acabe y ningun otro usuario pueda colarse en el mismo segundo lanzandolo tambien.

Gracias de antemano.
__________________
Creador de blackmoons.net
----------------------------------------------------------------------
  #2 (permalink)  
Antiguo 05/07/2011, 00:24
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 10 años, 8 meses
Puntos: 331
Respuesta: Bloquear base de datos

Utilza LOCK TABLES, tambien consulta la documentacion sobre TRANSACCIONES.
Salu2
__________________
Fere libenter homines, id quod volunt, credunt.
  #3 (permalink)  
Antiguo 06/07/2011, 05:45
Avatar de Chupytoloco  
Fecha de Ingreso: julio-2007
Mensajes: 88
Antigüedad: 13 años, 11 meses
Puntos: 1
Respuesta: Bloquear base de datos

gracias por guiarme repara2, ya me he leido la documentación al respecto pero me sale una duda:

Código:
*
LOCK TABLES cola_actualizacion WRITE

  SELECT * FROM cola_actualizacion
  DELETE * FROM cola_actualizacion

UNLOCK TABLES
*
El codigo de arriba funciona sin problemas, pero, que sucede cuando un usuario intenta acceder a una tabla bloqueada? espera su turno o da error?
__________________
Creador de blackmoons.net
----------------------------------------------------------------------
  #4 (permalink)  
Antiguo 06/07/2011, 05:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.323
Antigüedad: 13 años, 6 meses
Puntos: 2656
Respuesta: Bloquear base de datos

Este articulo te puede dar una idea detallada de como funciona el tema y los ejemplos son bastante claros: Concurrencia
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 06/07/2011, 10:17
Avatar de Chupytoloco  
Fecha de Ingreso: julio-2007
Mensajes: 88
Antigüedad: 13 años, 11 meses
Puntos: 1
Respuesta: Bloquear base de datos

He encontrado cosas interesante pero nada que conteste mi pregunta :S
__________________
Creador de blackmoons.net
----------------------------------------------------------------------
  #6 (permalink)  
Antiguo 06/07/2011, 10:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.323
Antigüedad: 13 años, 6 meses
Puntos: 2656
Respuesta: Bloquear base de datos

Cita:
que sucede cuando un usuario intenta acceder a una tabla bloqueada? espera su turno o da error?
Cita:
He encontrado cosas interesante pero nada que conteste mi pregunta :S
Entonces no has mirado los ejemplos con detalle. Mira este segmento del User B en 10.5 Ejemplos de Transacciones y Concurrencia (mismo link que te puse):
Código MySQL:
Ver original
  1. mysql> set autocommit=0;
  2.                Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> update bank set debit=666 where id=32;
  5. .
  6. .
  7. .
  8. .
  9. .
  10. .            
  11. .Wait unlock

A su vez, cuando la transacción del User B empieza, y el otro pretende hacer lo mismo, puede suceder esto:
Código MySQL:
Ver original
  1. mysql> update bank set debit=888 where id=32;
  2. ERROR 1213 (40001): Deadlock found when trying to get lock;
  3. Try restarting transaction
  4.  
  5.  
  6.  
  7. >T1 tiene bloqueado a T2, T2 espera la liberacion
  8. >al hacer el update en T1 ahora T1 espera a T2
  9. >por lo tanto se produce un deadlock
  10. >el dbms hace rollback en T1 (ultimo en espera) y procesa T2
¿Queda claro?
Cuando hay una transacción en curso, el otro usuario espera hasta que o bien la tabla se libera, se produce una incompatibilidad de esperas, o se le acaba el timeout asignado por default...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: bloquear
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 13:52.