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

java-如何处理Cassandra中的竞赛条件?,第1张

概述我正在使用Cassandra db开发一个简单的Spring Boot微服务.我的服务器在Subscription类中的主要实体如下:public final class Subscription { private String id; private String firstUser; private String seco

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

我的服务器在Subscription类中的主要实体如下:

public final class Subscription {    private String ID;    private String firstUser;    private String secondUser;    private String firstUserStatus;    private String secondUserStatus;}

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

>一个订阅将被保留
>正在验证表中是否存在另一个订阅
相同的用户
>现在可以保留具有相同用户的另一个订阅,并且
使先前的验证失效
>订阅保持不变.

解决该问题的正确方法是什么?

值得一提的是:用户的顺序无关紧要.如果要持久保留用户“ 1”和“ 2”的订阅,则必须不存在用户“ 1”和“ 2”或“ 2”和“ 1”的其他订阅.

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

>一个订阅将与firstUserStatus =“ ISSUED”和secondUserStatus =“ WAITING_ACTION”一起保留
>正在验证表中是否存在具有相同用户的另一个预订
>另一个具有相同ID(用户)且firstUserStatus =“ WAITING_ACTION”和secondUserStatus =“ ISSUED”的订阅现在可以持久保存,并使先前的验证失效
>初始订阅被保留,并覆盖已经存在的订阅-> secondUserStatus =“ ISSUED”已丢失最佳答案将对象的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;}
总结

以上是内存溢出为你收集整理的java-如何处理Cassandra中的竞赛条件? 全部内容,希望文章能够帮你解决java-如何处理Cassandra中的竞赛条件? 所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1230386.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存