Domanda

Quando un utente visita il mio sito web, vedrà la pagina con le pagine visualizzate minor numero. Tutte le pagine, tra cui un conteggio delle pagine visitate, sono memorizzati in un database MySQL. Se una pagina viene visualizzata, il conteggio delle pagine visitate è aumentato di uno.

Ora incorrere in una condizione di corsa se il mio server web ha più di un thread:

  

filettatura 1: L'utente A recupera pagina P con conteggio delle visualizzazioni di pagina di 10
  Discussione 2: retreives utente B pagina P con conteggio delle visualizzazioni di pagina di 10
  Discussione 1: conteggio visualizzazione di pagina della pagina P è aumentata dal 10 a 11 e salvato
  Discussione 2: numero di visualizzazioni di pagina di pagina P è aumentata dal 10 a 11 e salvato

Così, alla fine, la pagina è stata visualizzata due volte, ma la PageCounter viene aumentata da una sola.

Una soluzione è quella di bloccare la riga utilizzando un SELECT ... FOR UPDATE però poi, l'utente B deve attendere fino a quando il record utente A sta accedendo viene salvato e con molti fili tutto cercando di ottenere la pagina con le pagine visualizzate minor numero , ci sarà un ritardo.

Quindi la mia domanda:? È possibile quando un certo numero di righe sono bloccate, per ottenere la prima fila, che non è bloccato, in modo che i fili non dover aspettare a vicenda Come fare questo in MySQL?

Io preferirei una soluzione che si traduce in:

  

filettatura 1: l'utente pagina A serrature P con conteggio delle visualizzazioni di pagina di 10
  Discussione 2: l'utente pagina serrature B Q con conteggio delle visualizzazioni di pagina di 11 (perché la pagina è bloccata P)
  Discussione 1: conteggio visualizzazione di pagina della pagina P è aumentata dal 10 a 11 e salvato
  Discussione 2: numero di visualizzazioni di pagina della pagina Q è aumentata dalle 11 alle 12 e salvato

È stato utile?

Soluzione

Credo che si sta facendo qualcosa di simile a questo:

 UPDATE Pages SET PageView = 11 WHERE Id = 30

dove le costanti 11 e 30 sono inseriti dal codice (PHP?)

Un modo migliore è quello di fare questo:

 UPDATE Pages SET PageView = PageView + 1 WHERE Id = 30

Quindi non dovrebbe essere necessario per bloccare le righe in più query in modo che il problema che si desidera risolvere scompare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top