有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何处理Cassandra中的竞争条件?

我正在用Cassandra db开发一个简单的Spring Boot微服务

我的服务器中的主实体位于下面的Subscription类中:

public final class Subscription {

    private String id;

    private String firstUser;

    private String secondUser;

    private String firstUserStatus;

    private String secondUserStatus;

}

我的存储库使用订阅对象并将其持久化。 但在坚持之前,我应该检查一些约束,主要是不能有另一个订阅具有相同的firstUsersecondUser。 它可能失败的情况非常简单:

  1. 一个订阅将被持久化
  2. 正在验证表是否存在另一个订阅 同样的用户
  3. 另一个拥有相同用户的订阅可以随时保留 使以前的验证失效
  4. 正在保留订阅

解决这个问题的正确方法是什么

值得一提的是:用户的顺序并不重要。如果要持久化与用户“1”和“2”的订阅,则必须不存在与用户“1”和“2”或“2”和“1”的其他订阅

UPD:考虑到@bhspencer的答案,我可以提出另一种情况(我还需要强制状态保持一致):

  1. 一个订阅将通过firstUserStatus="ISSUED"secondUserStatus="WAITING_ACTION"持久化
  2. 正在验证表是否存在具有相同用户的其他订阅
  3. 另一个具有相同id(用户)和firstUserStatus="WAITING_ACTION"secondUserStatus="ISSUED"的订阅现在可以持久化,并使以前的验证失效
  4. 正在保留初始订阅并覆盖已存在的订阅->secondUserStatus="ISSUED"丢失了

共 (1) 个答案

  1. # 1 楼答案

    将对象的id设置为firstUser+secondUser的串联。使id成为确保订阅唯一性的主键

    由于您的订购要求,您应该首先对firstUser和secondUser进行排序,并按排序顺序将它们连接起来。这样做意味着generateId(“1”、“2”)和generateId(“2”、“1”)都将生成相同的id“1-2”

    public String generateId(String firstUser, String secondUser) {
      List<String> ids = new ArrayList<>();
      ids.add(firstUser);
      ids.add(secondUser);
      Collections.sort(ids);
      String result = ids.get(0) + "-" + ids.get(1);
      return result;
    }