例:

后实体

public class PostEntity implements Serializable {

    private static final long serialVersionUID = 567999999736566810L;

    @Id
    private String uid;

    // Value to be incremented
    @Column(nullable = false)
    private int likeCount = 0;



    // ... Getters and Setters
}


内部邮政服务

public int likePost(String postUID) {
    final PostEntity postEntity = postRepository.findByUid(postUID);
    int update = postEntity.getLikeCount() + 1;
    postEntity.setLikeCount(update);
    postRepository.save(postEntity);
    return update;
}


主要问题:
如何以这种方式避免冲突?
就像两个用户获得值6并将其递增到7一样,而不是期望的结果8。
我已经看到使用MongoDB在JS中完成此操作。

最佳答案

您可以使用SERIALIZABLE隔离的事务。使用@Transactional(isolation = Isolation.SERIALIZABLE)标记您的服务方法,以确保没有2个并发进程正在执行此事务。

Bealdung这篇文章解释了隔离和传播的不同类型。

关于java - 实体内的增量值(likeCount)不会遇到并发问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62311504/

10-13 03:37