如何在cassandra中处理竞争条件?

o4tp2gmn  于 2021-06-14  发布在  Cassandra
关注(0)|答案(1)|浏览(309)

我正在用cassandradb开发一个简单的spring-boot微服务。
中我的服务器中的主实体 Subscription 以下类别:

public final class Subscription {

    private String id;

    private String firstUser;

    private String secondUser;

    private String firstUserStatus;

    private String secondUserStatus;

}

我的存储库使用订阅对象并将其持久化。但在坚持之前,我应该检查一些约束条件,主要是不能有另一个具有相同约束条件的订阅 firstUser 以及 secondUser . 它可能失败的情况非常简单:
将保留一个订阅
正在验证表是否存在具有相同用户的另一个订阅
现在可以保留另一个具有相同用户的订阅,并使以前的验证失效
正在保留订阅。
正确的解决方法是什么?
值得一提的是:用户的顺序并不重要。如果要保留与用户“1”和“2”的订阅,则必须不存在与用户“1”和“2”或“2”和“1”的其他订阅。
upd:考虑到@bhspencer的答案,我可以提出另一个案例(我还需要强制状态保持一致):
一个订阅将与 firstUserStatus="ISSUED" 以及 secondUserStatus="WAITING_ACTION" 正在验证表是否存在具有相同用户的另一个订阅
具有相同id(用户)和 firstUserStatus="WAITING_ACTION" 以及 secondUserStatus="ISSUED" 现在可以保留并使以前的验证过时
正在保留初始订阅并覆盖已存在的订阅-> secondUserStatus="ISSUED" 是迷路了

xxb16uws

xxb16uws1#

将对象的id设置为firstuser+seconduser的串联。使id成为确保订阅唯一的主键。
由于您的排序要求,您应该首先对第一个用户和第二个用户进行排序,然后按排序顺序将它们连接起来。这样做意味着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;
}

相关问题