PDA

View Full Version : [MySql]Problema concorrenza UPDATE


MEMon
27-11-2006, 18:59
Come viene gestita la concorrenza in una query di tipo UPDATE?
Se due utenti fanno un update allo stesso momento che succede?

dupa
27-11-2006, 19:01
Come viene gestita la concorrenza in una query di tipo UPDATE?
Se due utenti fanno un update allo stesso momento che succede?
una UPDATE internamente è un'istruzione "atomica".
quindi da quando la "where" legge a quando la "set" scrive, non possono esserci cambiamenti.

cionci
27-11-2006, 19:33
Se due utenti fanno una update insieme ha ragione dupa, ma se i due utenti fanno una update selezionando le tuple in base a query precedenti allora si devono possono fare due cose:

- includere il tutto in un transazione (tabelle InnoDB)
- fare lock della tabella prima delle query che determinano le tuple da selezionare per l'update e rilasciarla dopo l'update (tabelle MyISAM)

MEMon
27-11-2006, 20:23
Se due utenti fanno una update insieme ha ragione dupa, ma se i due utenti fanno una update selezionando le tuple in base a query precedenti allora si devono possono fare due cose:

- includere il tutto in un transazione (tabelle InnoDB)
- fare lock della tabella prima delle query che determinano le tuple da selezionare per l'update e rilasciarla dopo l'update (tabelle MyISAM)
Credo di non aver ben capito.
Cosa sono le tuple in base ai query precedenti? Perdonami se è una domanda banale ma non sono ferratissimo sull'argomento, sto iniziando a guardarli ora i db.

dupa
27-11-2006, 20:42
Credo di non aver ben capito.
Cosa sono le tuple in base ai query precedenti? Perdonami se è una domanda banale ma non sono ferratissimo sull'argomento, sto iniziando a guardarli ora i db.

se tu fai nello stesso script due query da parte dello stesso utente, non c'è la garanzia che "tra le due query" se ne infili una terza lanciata da un diverso script in esecuzione in quel momento.

se vuoi la garanzia che un gruppo di più query venga eseguito in "un colpo solo" senza che altre query esterne possano infilarsi in mezzo devi racchiuedere le query in una "transazione", che verrà eseguita solo quando ne darei il "commit"

MEMon
27-11-2006, 21:03
Ok credo di aver capito, l'unica mia necessità è che se io salvo dei dati in un campo, e allo stesso tempo un altro utente salva dati nello stesso campo, i dati non siano "mischiati".

cionci
27-11-2006, 22:38
Ok credo di aver capito, l'unica mia necessità è che se io salvo dei dati in un campo, e allo stesso tempo un altro utente salva dati nello stesso campo, i dati non siano "mischiati".
Questo non succede, ma ovviamente una delle due modifiche viene persa...

Per tupla si intende una "riga" di una relazione (tabella)...

RaouL_BennetH
04-12-2006, 11:51
scusate se mi intrometto, ma sono interessato anche io :)

Io da alcuni esempi trovati sul sito ufficiale di mysql stavo agendo così:



LOCK TABLES nometabella WRITE;

UPDATE nometabella SET blablbalbalbabla....

UNLOCK TABLES;



è corretto o c'è un modo migliore di agire?

Grazie.

Raoul.

dupa
04-12-2006, 13:28
scusate se mi intrometto, ma sono interessato anche io :)

Io da alcuni esempi trovati sul sito ufficiale di mysql stavo agendo così:



LOCK TABLES nometabella WRITE;

UPDATE nometabella SET blablbalbalbabla....

UNLOCK TABLES;



è corretto o c'è un modo migliore di agire?

Grazie.

Raoul.

se le tabelle che usi supportano le transazioni, usa quelle e non le lock.

RaouL_BennetH
06-12-2006, 12:42
se le tabelle che usi supportano le transazioni, usa quelle e non le lock.

grazie :)

Ma non ho ancora studiato le transazioni. Inoltre il db che sto progettando può essere al massimo usato contemporaneamente da 4/5 utenze.

Intanto mi documento e grazie ancora :)

cionci
06-12-2006, 16:02
Quindi ricordati di fare tabelle MyISAM...