Режим блокировки PESSIMISTIC_WRITE в критериях против выбора для обновления

Есть ли существенная разница в производительности при использовании PESSIMISTIC_WRITE в качестве LockMode в критериях гибернации в качестве альтернативы для запроса «Выбрать для обновления».

Вариант использования включает следующие моменты:

  1. Ограничения на значения в нескольких столбцах, таких как статус, время
  2. Сортировка по нескольким столбцам
  3. Выберите только первую строку для обработки.

Эта обработка выполняется одновременно несколькими машинами/потоками. В настоящее время я использую критерии гибернации, и это вызывает тайм-ауты при многократном получении блокировки, что приводит к удушению всех других запросов.


person Amit Pareek    schedule 28.04.2017    source источник
comment
Вы уверены, что Hibernate действительно реализует PESSIMISTIC_WRITE для MySQL/MariaDB?   -  person Rick James    schedule 30.04.2017
comment
Да, для MySQL есть. Хотя я использую движок InnoDB вместо MariaDB   -  person Amit Pareek    schedule 30.04.2017
comment
Какой SQL генерируется для PESSIMISTIC_WRITE? То немногое, что я смог найти, говорит SELECT ... FOR UPDATE (в InnoDB). Когда трафик низкий, а запросы быстрые, вы вряд ли попадете в вопрос.   -  person Rick James    schedule 30.04.2017
comment
может быть 5 одновременных запросов.   -  person Amit Pareek    schedule 30.04.2017
comment
да, это ВЫБРАТЬ для ОБНОВЛЕНИЯ в InnoDB   -  person Amit Pareek    schedule 30.04.2017


Ответы (1)


В этом случае FOR UPDATE «требуется» для правильного параллелизма:

BEGIN;
SELECT x ... FROM t ... FOR UPDATE;
use `x` for whatever
UPDATE t ...;
COMMIT;

Без FOR UPDATE значение x может измениться, тем самым потенциально аннулируя цель UPDATE.

person Rick James    schedule 30.04.2017