请原谅,这个问题可能看起来很天真,但我遇到了一个场景,我需要管理Electron 商务store 数据库中的产品数量.

有一个具有整数变量productCount的Product类,它表示数据库中对站点用户可见的可用产品的数量.现在,这个类被Electron 商务站点的几个线程或几个用户访问.每个人都在将产品添加或移除到自己的购物车中.

正在使用的ORM框架是Hibernate

示例代码

@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
   }

从代码中可以清楚地看到,我需要对数据库中的产品计数进行并发判断,以防止更新丢失.

此外,如果多个用户试图在数据库中只添加一个剩余产品.产品应该添加到哪个用户的购物车?

我对此做了一点研究

我找到的可能方法是

  1. 为Product创建一个Singleton类.这将确保在整个应用程序中只有一个产品实例可用.

  2. 同步的addProductToCart&removeTheProductFromTheCart种方法. 这将一次只允许一个线程更新产品计数和更新数据库.

  3. 使用数据库并发控制应用一些数据库事务隔离级别,乐观/悲观锁定为productCount.我使用的是MySQL,默认隔离级别是REPEATABLE_READ.

处理这个问题的最佳方法是什么?

推荐答案

对于您正在考虑的前两种可能性,只有当您被限制为只能部署应用程序的单个实例时,这两种可能性才会起作用.您不能跨多个应用程序实例管理单个实例,也不能跨多个JVM进行同步.因此,如果您使用其中一种方法,您的部署选项将受到限制,部署应用程序的多个实例的唯一方法是执行诸如将会话固定到特定实例之类的操作,这不利于负载平衡.因此,这两个似乎都是不受欢迎的.

从数据库中获取产品数量的方法的优点是,当应用程序跨多个实例扩展时,它仍然有效,而不会 destruct 负载平衡.

您可能会认为,这将只是一台服务器上的一个实例,所以我可以 payable 过go .但是,在构建应用程序时,可能不完全清楚应用程序将如何部署(我曾经遇到过这样的情况:在预生产环境中设置应用程序之前,我们不知道计划是什么),或者以后可能有理由更改应用程序的部署方式;如果应用程序的负载超过预期,那么设置第二个框可能会很有好处.

有一件事我并不清楚,那就是产品数量是否正确是多么重要.在不同的业务领域(机票、运输),超额预订是很常见的,保持100%的准确计数可能会带来更多麻烦,尤其是在过程的早期阶段,例如向购物车添加商品(与客户实际promise 购买的时间相比).在客户购买商品时,确保您通过数据库事务预订这些商品可能更有意义(或者不预订,请参阅再次超额预订).

在Web应用程序中,从购物车中的商品到实际购买的商品的转换率很低,这似乎很常见.请记住,您的计数的精确度级别适合您的业务域.

Database相关问答推荐

避免数据库联接的两个查询替换

如何在保持相同 Flyway 校验和的同时更正语法?

是否可以同时从 RocksDB 读取?

将一个表中的多个列连接到另一个表中的单个列

优雅地处理 EJB/JPA 环境中的约束冲突?

有没有办法为 2 个具有不同包名称的应用程序提供 1 个 Firebase 数据库?

类似 Hibernate 的 C++ 框架

多少个外键才算太多?

使用 2 个进程处理数据库

保存图像:文件还是 blob?

如何通过 PHP 和 Linux 使用 pdo 连接到 mssql?

表模块与域模型

使用 PHP/PDO 判断数据库表是否存在

如何使用 Entity Framework CF 在父级之前删除子实体?

TransactionScope 是如何工作的?

Redis Pub/Sub 和 Redis Stream 之间的主要区别是什么?

如何在没有验证提取的情况下将 MSSQLServer 数据库提取为 .dacpac?

Rails:'schema.rb' 中的版本号是否用于任何用途?

将 NULL 插入 MySQL 时间戳

Guice、JDBC 和管理数据库连接