Извините, если этот вопрос может показаться наивным, но я столкнулся с ситуацией, когда мне нужно управлять количеством продуктов в базе данных магазина электронной коммерции.
Существует класс Product с целочисленной переменной productCount
, который обозначает количество доступных продуктов в базе данных, которое видимо для пользователей сайта. Теперь к этому классу обращаются несколько потоков или могут сказать несколько пользователей сайта электронной коммерции. Каждый добавляет или удаляет продукт в свою тележку.
Используемая структура ORM - это спящий режим
Пример кода
@Entity
@Table
class Product{
@Column
private int productCount;
public void addProductToCart(){
// decrements the product count by 1 & updates the database
}
public void removeTheProductFromTheCart(){
// increments the product count by 1 & updates the database
}
Как ясно из кода, мне нужно сохранить проверку concurrency на счете продукта в базе данных, чтобы предотвратить потерянные обновления.
Также, если несколько пользователей пытаются добавить только один левый продукт в базу данных. Какую пользовательскую корзину продукт следует добавить?
Я немного исследовал этот
Возможные пути, которые я нашел, были
-
Создание класса Singleton для Product. Это обеспечит доступность всего одного экземпляра продукта во всем приложении.
-
Синхронизировать методы
addProductToCart
иremoveTheProductFromTheCart
. который позволит только одному потоку обновлять счетчик продуктов и обновлять db за раз. -
Использование базы данных concurrency управляет применением некоторого уровня изоляции транзакции db, оптимистичной/пессимистической блокировки для
productCount
. Я использую mysql, уровень изоляции по умолчанию -REPEATABLE_READ
.
Каким будет лучший подход к решению этого вопроса?