Хотел бы обратиться к знатокам JPA. Имею постгрю, там есть запрос, который совершает пуллинг из БД (достаточно классическая ситуация):
@Query(
nativeQuery = true,
value = """
WITH selected AS (
SELECT id FROM my_task
WHERE status = 'DRAFT'
ORDER BY created_at
LIMIT 1 FOR UPDATE SKIP LOCKED
)
UPDATE my_task SET status = 'EXECUTING'
FROM selected
WHERE my_task.id =
selected.id RETURNING *;
"""
)
fun pollTask(): MyTaskEntity?
Вопрос. Если тут будет добавлена анноташка
@Transactional, то никаких сайд эффектов ожидаться не будет? Важно отметить, что этот запрос вызывается в разных потоках одновременно, собственно поэтому и стоит семантический SKIP LOCKED, который в том числе не даёт простаиваться другим потокам во время выполнения подзапроса в CTE. Достаточно классический способ решения такой проблемы с точки зрения постгресса.
P.S
Метод для вызова pollTask() не помечен транзакцией, а вызывается через тред пулл в шедулере, представляет из себя что-то в стиле:
@Async("tasksPool")
@Scheduled(fixedRate = 500)
fun perfomSomeOperations() {
val task = taskRepository.pollTask()
// Some logic here
}