Dal momento che non ho ricevuto risposta, ho iniziato a fare benchmarking. I miei criteri sono i seguenti:
- 20.000 codici pregenerati
- Utilizzo di Apache
ab
comando con 20.000 richieste, 100 simultaneità:ab -n 20000 -c 100
- Servlet -> EJB (JPA 2.0 EclipseLink, JTA) per eseguire l'aggiornamento in DB (come avverrà tramite un'azione JSF nella situazione reale)
- 2 versioni del servlet, una con l'opzione 1 (SELECT ... FOR UPDATE) e una con l'opzione 2 (UPDATE ... LIMIT 1)
- Arrestato Glassfish, colpisci manualmente il servlet testato 5 volte per riscaldarlo, ripristina tutto su NULL su user_id
- I test vengono eseguiti 3 volte ciascuno e viene fornita la media
Risultati:
SELEZIONA... PER AGGIORNARE; AGGIORNAMENTO... :
Concurrency Level: 100
Time taken for tests: 758.116 seconds
Complete requests: 20000
Failed requests: 0
Write errors: 0
Row updated: 20000
AGGIORNAMENTO.... LIMITE 1:
Concurrency Level: 100
Time taken for tests: 773.659 seconds
Complete requests: 20000
Failed requests: 0
Write errors: 0
Row updated: 20000
Quindi, almeno sul mio sistema, l'opzione con 2 query sembra più efficiente dell'unica query. Non me lo aspettavo :)