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;
}
我的存储库使用订阅对象并将其持久化。
但在坚持之前,我应该检查一些约束,主要是不能有另一个订阅具有相同的firstUser
和secondUser
。
它可能失败的情况非常简单:
- 一个订阅将被持久化
- 正在验证表是否存在另一个订阅 同样的用户
- 另一个拥有相同用户的订阅可以随时保留 使以前的验证失效
- 正在保留订阅李>
解决这个问题的正确方法是什么
值得一提的是:用户的顺序并不重要。如果要持久化与用户“1”和“2”的订阅,则必须不存在与用户“1”和“2”或“2”和“1”的其他订阅
UPD:考虑到@bhspencer的答案,我可以提出另一种情况(我还需要强制状态保持一致):
- 一个订阅将通过
firstUserStatus="ISSUED"
和secondUserStatus="WAITING_ACTION"
持久化 - 正在验证表是否存在具有相同用户的其他订阅
- 另一个具有相同id(用户)和
firstUserStatus="WAITING_ACTION"
和secondUserStatus="ISSUED"
的订阅现在可以持久化,并使以前的验证失效 - 正在保留初始订阅并覆盖已存在的订阅->
secondUserStatus="ISSUED"
丢失了
# 1 楼答案
将对象的id设置为firstUser+secondUser的串联。使id成为确保订阅唯一性的主键
由于您的订购要求,您应该首先对firstUser和secondUser进行排序,并按排序顺序将它们连接起来。这样做意味着generateId(“1”、“2”)和generateId(“2”、“1”)都将生成相同的id“1-2”