2012-08-29 56 views
5

Guión 1.tabla mysql bloqueo con php

$query_ = "lock tables test1 as test11 write"; 
mysql_query($query); 
$query_ = "select * from test11"; 
sleep(20); 
$query_ = "unlock tables"; 
mysql_query($query_); 

escritura 2.

$query_ = "select * from test1"; 
$result = mysql_query($query_); 

El problema es que si corro segundo script mientras se ejecuta la primera secuencia de comandos. La tabla no está bloqueada. Y puedo leer cualquier dato de eso.

Necesito que se bloquee y devuelva el error.

¿Cómo hacer esto?

+0

Puede que no ayude a responder su pregunta, pero debe dejar de usar las funciones 'mysql_ *'. Están siendo desaprobados. En su lugar, use [PDO] (http://php.net/manual/en/book.pdo.php) (compatible con PHP 5.1) o [mysqli] (http://php.net/manual/en/book. mysqli.php) (compatible a partir de PHP 4.1). Si no está seguro de cuál usar, [lea este artículo] (http://www.deprecatedphp.com/mysql_/). – Matt

+0

Creo que la tabla solo se bloqueará para esa instancia de conexión mysql en particular. Creo que funciona de esta manera para evitar condiciones de carrera. – Travesty3

+0

¿Qué sentido tiene bloquearlo para una conexión mysql particular? ¿Por qué mi secuencia de comandos desea insertar algo cuando no inserto nada? –

Respuesta

5

Estás read bloqueo de la mesa con $query_ = "lock tables test1 as test11 read"; - lo que significa que otras consultas aún pueden leer sin ningún problema lo que-para-siempre (Relevante link - desplazarse hacia abajo a la sección sobre tipos de bloqueo):

Información sobre el tipo de cerradura read:

  • La sesión que contiene el bloqueo puede leer la tabla (pero no escribirla).
  • Las sesiones múltiples pueden adquirir un bloqueo de lectura para la tabla al mismo tiempo.
  • Otras sesiones pueden leer la tabla sin adquirir explícitamente un bloqueo READ.

Si desea detener nada demás tanto como Reding la tabla, es necesario utilizar una cerradura write de la siguiente manera:

$query_ = "lock tables test1 as test11 write"; 
+1

Cambio el modificador para "escribir" aún segundo script devuelve todos los registros. –

+0

verifique mi ejemplo cambié para escribir. Siempre lo mismo. lee todo bien pruébalo tú mismo, verás que no funciona. –

+0

@ pain.reign Los bloqueos en las tablas son específicos de la sesión, ¿es esta una pregunta arbitraria (lo cual es genial) o está tratando de emular una transacción en las tablas que está bloqueando? – Fluffeh

7

Si no quieren que otros accedan a esa tabla a continuación, use

LOCK TABLES test1 WRITE; 

Otro script no devolverá el error, pero esperará hasta que se libere el bloqueo.

creo que sirve ...

+0

Lo probé. Todavía no bloquea nada. La segunda secuencia de comandos puede acceder fácilmente a los datos. –

+1

Parece que desde su primer script, primero está escribiendo write lock en test1, luego está ejecutando una consulta, luego durmiendo durante 20 segundos y luego desbloqueando la tabla. Hasta que desbloquees, el segundo script está esperando a que la mesa se desbloquee. Tan pronto como la tabla se desbloquea, la consulta en el segundo script obtiene acceso a la tabla y devuelve datos. Intente aumentar el tiempo de sueño a 100 o digamos 200 y luego verifique los resultados. – Shubhansh

2

Tiene que conceder los derechos de las tablas de bloqueo para el usuario db.

0

Si el código en la pregunta es en realidad el código que se está utilizando, hay un error tipográfico. La primera llamada a mysql_query() está pasando en una variable diferente. Dejó el '_' al final del nombre de la variable. Además, tienes un concepto erróneo sobre lo que hacen los bloqueos. Bloquea para evitar que otras secuencias de comandos accedan a los datos y no causa errores. Cuando el script 2 intenta acceder o modificar datos que no están permitidos debido a un bloqueo, se detendrá y esperará a que se libere el bloqueo. Después de que el script 1 desbloquee la tabla, el script 2 continuará y se completará sin problemas.

Cuestiones relacionadas