Como não obtive resposta, comecei a fazer benchmarking. Meus critérios são os seguintes:
- 20.000 códigos pré-gerados
- Uso do Apache
ab
comando com 20.000 solicitações, 100 simultaneidade:ab -n 20000 -c 100
- Servlet -> EJB (JPA 2.0 EclipseLink, JTA) para realizar a atualização no DB (pois será através de uma ação JSF em situação real)
- 2 versões do Servlet, uma com opção 1 (SELECT ... FOR UPDATE ), e outra com opção 2 (UPDATE ... LIMIT 1)
- Pare o Glassfish, pressione o Servlet testado manualmente 5 vezes para aquecê-lo, redefina tudo para NULL para user_id
- Os testes são executados 3 vezes cada e a média é fornecida
Resultados:
SELECIONE... PARA ATUALIZAÇÃO; ATUALIZAR ... :
Concurrency Level: 100
Time taken for tests: 758.116 seconds
Complete requests: 20000
Failed requests: 0
Write errors: 0
Row updated: 20000
ATUALIZAÇÃO.... LIMITE 1:
Concurrency Level: 100
Time taken for tests: 773.659 seconds
Complete requests: 20000
Failed requests: 0
Write errors: 0
Row updated: 20000
Então, pelo menos no meu sistema, a opção com 2 consultas parece mais eficiente do que uma consulta. Eu não esperava isso :)