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

本文探讨了在SpringBoot微服务中使用CassandraDB进行数据持久化时遇到的重复订阅问题。通过调整Subscription类的设计,引入了一种利用用户ID组合生成唯一ID的方法,以确保数据的一致性和唯一性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我正在使用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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值