кнопка в боте выполняет функцию, которая включает в себя изменение базы данных. а именно - модель меняет значение is_active и прибавляет значение value к другому значению в другой таблице
- если путем спама отправить несколько нажатий на эту кнопку, value прибавится к другому значению несколько раз, даже если в начале есть проверка на is_active (sqlalchemy асинхронная, бот тг также асинхронный)
Подскажите как можно разрешить проблему?
Select for update
statement = select(model, for_update=True).where(...) result = await self.session.execute(statement).one() result.is_active = False other_model_obj.value_sum += result.value await self.session.commit() Что-то на подобии этого будет?
Да можно и session.get тоже юзать
Я правильно понимаю что пока не будет закомичена первая сессия с транзакциями, которые вовлекают в себя model, эту model нельзя будет достать из бд, будет ошибку выплевывать?
Будет висеть в ожидании, но не более какого-то таймаута
то есть следующие селекты следующие будут ждать комита, и уже вернут мне модель где is_active изменен перевой сессией.
Это дефолтное поведение для for update. Там есть ещё несколько среди которых nowait который сразу вернёт ошибку
Обсуждают сегодня