我的服务器应用程序中有两种方法:
boolean isMessageExist(messageId),执行以下查询:
从消息中选择messageId,其中messageId = 1;
执行以下查询的insertMessage(int messageId,String data):
INSERT INTO消息(messageId,data)VALUES(1,xyz);
在我的代码中,我正在执行以下操作,以满足“仅在消息不存在时才插入”的要求。
if(!isMessageExist(1)){
insertMessage(1,"xyz")
}
但是,如果对同一messageId的请求几乎同时发生,则上述代码无效。
,即在时间T0 ...... Read1(1),Write1(1)和Read2(1),Write2(1)同时发生,因为两个请求是同时从客户端发送的。有没有办法在服务器端按顺序发出这些请求。我的意思是Read2(1)应该总是得到结果Write1(1)?
如果由于性能开销导致IF NOT NOT EXISTS,我不想使用CAS操作。 有没有其他方法可以达到我的要求?请建议。
答案 0 :(得分:0)
使用Cassandra的轻量级交易(LWT)如果不是EXISTS应该比您目前正在做的更便宜,并满足您对唯一性的要求。
INSERT INTO message( messageId, data ) VALUES ( 1, xyz ) IF NOT EXISTS
您可以测试并验证性能,但两次往返(读取,写入)几乎肯定比单个INSERT更昂贵...如果不是EXISTS。
或者,如果您可以重新设计您的应用程序,那么它使用UPSERTS - 新值只会覆盖旧数据,这样会更好,并使用更原生的Cassandra风格。