Ciao,
Il 24 gennaio 2013 19:12, Davide B. [email protected] ha
scritto:
Altre info:
stiamo sospettando un problema di race condition sul devise|:validatable
se togliamo il fork dallo scriptino e facciamo 1000 richieste
sequenziali nessun problema.
Avete ragione: si tratta di una race condition causata dall’uso di
validazioni di unicit; un problema noto, descritto nella
documentazione ( http://bit.ly/XD8AAx ).
Arriva una richiesta di creare l’utente [email protected]; prima di creare
il record sul db, ActiveRecord::Validations controlla che non esista
gi, eseguendo una query sul db. Se trova che quell’email c’ gi, d
un errore di validazione, altrimenti inserisce il record con un’altra
query al db.
Se le richieste vengono servite in concorrenza, le operazioni sul db
possono accavallarsi, per cui due richieste controllano se esiste gi
[email protected], entrambe vedono che non esiste, la prima crea il
record, la seconda crea il record.
A quel punto tutto dipende dal db, e ci sono due possibilit:
o sul db non ci sono vincoli; in questo caso vengono creati dei
duplicati, e il db sar inconsistente;
o invece sul db ci sono vincoli di unicit, e allora si avranno errori
db ossia eccezioni come quella che capita a voi, ma in compenso il db
rester consistente.
Lanciando mille richieste contemporaneamente, le probabilit che ci
sia almeno un accavallamento enorme; nella vita quotidiana, invece,
a molte applicazioni web non capita neanche una volta.
La documentazione di cui sopra suggerisce di catturare
ActiveRecord::RecordNotUnique per dire all’utente che i dati sono
duplicati.
pietro