ну там функция довольно долгая которая потом данные обрабатывает, достаточно долгая, чтоб пользователь успел дважды клацнуть на кнопку и сломать данные в бэке
выше уже писали, может повторюсь: транзактор фигачит транзакции по одной, поэтому одна долгая может всех подвесить. Лучше заранее просчитать все что можно и передать доп. параметром в твою функцию
ему не нужно что-то высчитывать внутри транзакции, внутри транзакции нужно ему нужно просто проверить, что во время расчетов ничего не поменялось. такой кастомный cas