Это тип вещи, для которой предназначены транзакции.Зарядка карточек и сброс счетчика wislist должны выполняться в одной транзакции, чтобы они выполнялись как атомная единица.Кроме того, чтобы избежать описываемой проблемы, необходимо установить уровень изоляции транзакции как минимум «Read Committed» «Repeatable Read».
Дополнительная информация:
Вот как это сделать: 1. Приложение открывает транзакцию в базе данных.2. Приложение делает выбор в таблицах желаний, чтобы получить количество.3. Если счетчик> = n, приложение делает другой выбор в списке пожеланий и связанных таблицах, чтобы получить ожидающие заказы в списке желаний, пользователей, информацию о карте и т. Д. 4. В зависимости от бизнес-правил, касающихся транзакций по карте, приложение затем удаляетотложенные ордера или что угодно, чтобы сбросить список желаний до нуля.5. Затем приложение закрывает транзакцию.
Вот почему это работает: когда приложение делает выбор в таблицах списков пожеланий, чтобы получить счетчик внутри транзакции, БД устанавливает блокировку чтения для таблиц, связанных с этим.запрос.Если другая транзакция, которая открылась во время ожидания предыдущей транзакции, пытается прочитать те же самые таблицы, она должна дождаться, пока предыдущая транзакция не получит COMMIT или ROLLBACK.Если предыдущая транзакция COMMITS, то следующая транзакция увидит счет 0 и все остальные модификации.В противном случае, если приложение выполнит ROLLBACK по какой-либо причине, ни одно из данных не изменится и следующая транзакция увидит данные такими, какими они были до первой транзакции.