2012-08-29 14 views
5

Script 1.blocco di tabella mysql con php

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

Script 2.

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

Il problema è che se corro secondo script durante l'esecuzione primo script. La tabella non è bloccata. E posso leggere tutti i dati da esso.

Ho bisogno che sia bloccato e restituisca l'errore.

Come fare questo lavoro?

+0

Potrebbe non essere d'aiuto rispondere alla tua domanda, ma dovresti smettere di usare le funzioni di 'mysql_ *'. Stanno deprecando. Usa invece [PDO] (http://php.net/manual/en/book.pdo.php) (supportato come da PHP 5.1) o [mysqli] (http://php.net/manual/en/book. mysqli.php) (supportato come da PHP 4.1). Se non sei sicuro di quale usare, leggi questo articolo (http://www.deprecatedphp.com/mysql_/). – Matt

+0

Credo che la tabella sarà bloccata solo per quella particolare istanza di connessione mysql. Penso che funzioni in questo modo per prevenire le condizioni di gara. – Travesty3

+0

che senso bloccare per una particolare connessione mysql? Perché il mio script vuole inserire qualcosa quando non inserisco nulla? –

risposta

5

Tu sei read bloccare la tavola con $query_ = "lock tables test1 as test11 read"; - il che significa che altre query possono ancora leggere senza problemi quello che-così-mai (Relevant link - scorrere verso il basso per la sezione sui tipi di blocco):

Informazioni su il tipo di blocco read:

  • La sessione che contiene il blocco può leggere la tabella (ma non scriverla).
  • Più sessioni possono acquisire un blocco READ per la tabella allo stesso tempo.
  • Altre sessioni possono leggere la tabella senza acquisire esplicitamente un blocco READ.

Se si desidera interrompere niente altra cosa così tanto come Reding tabella, è necessario utilizzare un blocco write come segue:

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

Cambio il modificatore in "Scrivi", mentre il secondo script restituisce tutti i record. –

+0

controlla il mio esempio che ho modificato per scrivere. ancora lo stesso. legge tutto bene. provalo tu stesso, vedrai che non funziona. –

+0

@ pain.reign I blocchi sulle tabelle sono specifici della sessione, si tratta di una domanda arbitraria (che è interessante) o si sta tentando di emulare una transazione sulle tabelle bloccate? – Fluffeh

7

Se non si vuole ad altri di accedere quel tavolo allora utilizzare

LOCK TABLES test1 WRITE; 

Altro script non restituirà errore ma attenderà fino al rilascio del blocco.

Speranza che aiuta ...

+0

L'ho provato. Ancora non blocca nulla. Il secondo script può facilmente accedere ai dati. –

+1

Sembra che dal tuo primo script, prima stai mettendo il blocco di scrittura su test1, quindi stai eseguendo una query, poi dormi per 20 secondi, quindi sblocchi il tavolo. Fino a quando non si sblocca, il secondo script attende la tabella da sbloccare. Non appena la tabella si sblocca, la query nel secondo script accede alla tabella e restituisce i dati. Prova ad aumentare il tempo di sonno a 100 oa dire 200 e poi controlla i risultati. – Shubhansh

2

È necessario concedere i diritti delle tabelle di blocco per l'utente db.

0

Se il codice nella domanda è in realtà il codice utilizzato, è presente un errore di battitura. La prima chiamata a mysql_query() sta passando in una variabile diversa. Hai lasciato il "_" alla fine del nome della variabile. Inoltre, hai un'idea sbagliata su cosa fanno i lucchetti. I blocchi non impediscono ad altri script di accedere ai dati e non causano errori. Quando lo script 2 tenta di accedere o modificare i dati che non è consentito a causa di un blocco, si interromperà e attenderà il rilascio del blocco. Dopo che lo script 1 ha sbloccato la tabella, lo script 2 procederà e verrà completato senza problemi.