【发布时间】:2019-06-08 14:30:41
【问题描述】:
我正在使用 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
标签: java spring cassandra race-condition spring-data-cassandra