В моем расширении у меня есть набор операций, которые генерируются действиями пользователя. Каждая операция состоит из нескольких шагов.
Для обработки этих операций я реализовал задачу планировщика (расширение «планировщик» 6.2.0). Теперь дело в том, что шаги каждой операции должны выполняться один за другим, а не параллельно. Это означает: при запуске задача планировщика должна найти очередную «свободную» операцию, заблокировать ее и обработать.
Для блокировки в таблице базы данных с операциями есть целочисленный столбец "isLocked". Поэтому я хотел использовать следующий оператор SQL для блокировки операции:
$lockID = time();
'UPDATE operations SET isLocked = '.$lockID.' WHERE isLocked = 0 AND uid = '.$freeOperationFound->getUid().';
'
После этой команды SQL я хотел проверить, установлена ли блокировка:
$repository->findOneByIsLocked($lockID);
Если блокировка прошла успешно, можно начать обработку шага операции.
Если в это время другой экземпляр задачи планировщика блокирует эту операцию, приведенный выше оператор SQL ничего не делает из-за условия: WHERE isLocked = 0
.
Проблема в том, что Extbase игнорирует операторы SQL UPDATE.
Если я просто обновлю объект свободной операции через репозиторий, блокировка другого экземпляра задачи может быть перезаписана. Мне нужно какое-то "условное" обновление.