我的客户有一个销售电子产品的电子商务网站,有时产品的销售次数超过了库存。这是因为,如果两个用户同时购买一种产品,而库存只剩下一种产品,则一个会话在另一个会话开始之前尚未完成将该产品注册为已售完(因此它会正常继续,认为有一个左)即使在流程开始时进行了检查。这显然会花费金钱(退款费用、退款等)并且给消费者带来不便。
所以我想知道是否有办法解决这个问题?我想在流程开始时创建一个“标记”,即它会检查库存,如果售完,它将对产品进行标记,从而防止其他会话购买它。但这也产生了更多问题:如果客户方面发生了一些事情导致他们在流程中取消(断电等),那么即使产品被标记为已售出,但自结帐以来它实际上并没有售出过程没有完成。如果这种情况持续发生,就会出现产品库存过剩的情况。其次,一个会话也可以在另一个会话将其标记为已售出时检查库存,因此即使第二个会话已经购买了它,第一个会话仍将继续。这让我们回到了最初的问题。
我正在查看数据库端的表锁定,但我不确定这是否是最好的主意。任何建议将不胜感激!
谢谢,迪普
我在我的存储库中有一个简单的查询,用于增加给定 post 对象的帖子的评论数:
public interface PostsRepository extends PagingAndSortingRepository<Post, Long>{
//...
@Modifying
@Query("UPDATE Post p set p.numComments = p.numComments + 1 where p = :post")
void incrementNumComments(@Param("post") post obj);
//...
}
Run Code Online (Sandbox Code Playgroud)
模型:
@Entity
@Table(name="posts")
@Inheritance(strategy= InheritanceType.JOINED)
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "post_id", updatable = false, nullable = false)
@Access(AccessType.PROPERTY)
private Long id;
}
Run Code Online (Sandbox Code Playgroud)
但是,hibernate 似乎使用临时表来执行查询。以下是从日志生成的查询:
Hibernate: insert into HT_posts select pos0_.post_id as post_id from posts pos0_ where pos0_.s_id=?
Hibernate: update posts set num_comments=num_comments+1 where (post_id) IN …Run Code Online (Sandbox Code Playgroud)