2012-03-01 1 views
9

Se ho uno script php che chiama INSERT, UPDATE, DELETE, ecc su una connessione MySQL, e che lo script viene chiamato a volte non controllati da un'operazione POST, è sempre "sicuro" (vale a dire, non si tradurrà in tabelle corrotti o collisioni durante le richieste)?MySQL è "thread safe" da uno script php?

Ad esempio, se vengono richieste 500 durante un periodo di 1 secondo.

Se sì, come fa php/mysql a raggiungere questo obiettivo?

Se no, che cosa si devono fare per garantire l'accesso "seriale" o l'accesso simultaneo al sicuro?

+1

'INIZIO; ... lavora ...; COMMIT; ' –

risposta

9

MySQL utilizza il blocco (livello tabella per MyISAM o livello riga per InnoDB), che non consente 2 processi (2 chiamate allo script) per modificare la stessa riga. Quindi la tabella non si bloccherà *, ma è possibile che MySQL non possa gestire il numero di richieste in tempo ragionevole e le richieste attenderanno. Dovresti sempre ottimizzare le tue query per essere il più veloce possibile.

* MyISAM potrebbe bloccarsi su inserimento/aggiornamento applicazioni intensive, ma ha il ripristino automatico. Tuttavia tenere presente che in tale applicazione, InnoDB ha di gran lunga migliore prestazione

+1

Ci sono state molte risposte eccellenti a questa domanda; Non posso credere alla velocità e alla risposta della comunità in questo caso - grazie.Credo che alcune delle altre risposte possono essere più istruttivo per qualcuno che cerca di costruire una solida, enterprise a livello di implementazione - se che si è, vedere di seguito. Io, tuttavia, sto cercando di fare il meno possibile e volevo semplicemente sapere se mysql poteva gestire molte richieste simultanee. La risposta è sì a chiunque non venga pagato in modo specifico per conoscere un'altra risposta. Grazie, Darhazer. – SG1

2

è sempre "sicuro" (ovvero, non genererà tabelle o collisioni danneggiate durante le richieste)?

Se sì, in che modo? Php/mysql raggiungere questo obiettivo?

serrature da tavolo/fila.

0

utilizzare le transazioni ... vedi this

0

Penso che la terminologia che si sta cercando è transazioni e livelli di isolamento. Se questi sono impostati in base alle tue esigenze, non devi preoccuparti delle collisioni. Ecco il tutorial su how it works.

1

Di solito i database sono solidi a collisioni, tuttavia ci sono operazioni importanti quelli devono essere inseriti o scartato. Pensa a un deposito in contanti su un conto bancario.

Al fine di raggiungere questo risultato si potrebbe essere interessati a utilizzare le transazioni:

PHP + MySQL transactions examples

2

MySQL utilizza serrature per Isoloation e transactions per Atomicità. Le transazioni richiedono InnoDB o BDB. InnoDB supporta il supporto completo ACID.

Serrature e transazioni, unite, risolverà il problema di concorrenza.

Per impostazione predefinita, MySQL ha implicit transactions.

Sicuramente conoscere queste funzionalità per vedere se si adattano al conto. MyISAM utilizza il blocco delle tabelle, mentre InnoDB offre il blocco a livello di riga, in modo da poter soddisfare le tue esigenze meglio dell'altro.