小编Dyi*_*302的帖子

避免电子商务场景中的竞争条件

我的客户有一个销售电子产品的电子商务网站,有时产品的销售次数超过了库存。这是因为,如果两个用户同时购买一种产品,而库存只剩下一种产品,则一个会话在另一个会话开始之前尚未完成将该产品注册为已售完(因此它会正常继续,认为有一个左)即使在流程开始时进行了检查。这显然会花费金钱(退款费用、退款等)并且给消费者带来不便。

所以我想知道是否有办法解决这个问题?我想在流程开始时创建一个“标记”,即它会检查库存,如果售完,它将对产品进行标记,从而防止其他会话购买它。但这也产生了更多问题:如果客户方面发生了一些事情导致他们在流程中取消(断电等),那么即使产品被标记为已售出,但自结帐以来它实际上并没有售出过程没有完成。如果这种情况持续发生,就会出现产品库存过剩的情况。其次,一个会话也可以在另一个会话将其标记为已售出时检查库存,因此即使第二个会话已经购买了它,第一个会话仍将继续。这让我们回到了最初的问题。

我正在查看数据库端的表锁定,但我不确定这是否是最好的主意。任何建议将不胜感激!

谢谢,迪普

php database race-condition e-commerce payment-processing

5
推荐指数
1
解决办法
2632
查看次数

JPA Hibernate 正在为简单的更新查询创建临时表

我在我的存储库中有一个简单的查询,用于增加给定 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)

java spring hibernate jpa

4
推荐指数
1
解决办法
6398
查看次数