Ответ 1
Поскольку я не получил ответа, я начал выполнять бенчмаркинг. Мои критерии таковы:
- 20 000 предварительно сгенерированных кодов
- Использование команды Apache
ab
с 20 000 запросов, 100 concurrency:ab -n 20000 -c 100
- Servlet → EJB (JPA 2.0 EclipseLink, JTA) для выполнения обновления в БД (как это будет с помощью действия JSF в реальной ситуации)
- 2 версии сервлета, одна с опцией 1 (SELECT... FOR UPDATE), и одна с опцией 2 (UPDATE... LIMIT 1)
- Остановите Glassfish, ударите проверенный сервлет вручную 5 раз, чтобы согреть его, reset all до NULL до user_id
- Тесты выполняются 3 раза в каждом и среднее значение
Результаты:
SELECT... FOR UPDATE; UPDATE...:
Concurrency Level: 100
Time taken for tests: 758.116 seconds
Complete requests: 20000
Failed requests: 0
Write errors: 0
Row updated: 20000
UPDATE.... LIMIT 1:
Concurrency Level: 100
Time taken for tests: 773.659 seconds
Complete requests: 20000
Failed requests: 0
Write errors: 0
Row updated: 20000
Итак, по крайней мере, в моей системе опция с двумя запросами кажется более эффективной, чем один запрос. Я не ожидал этого:)