我怎么知道该记录是重复的还是已成功插入?

时间:2015-07-13 18:07:56

标签: cassandra cql datastax datastax-java-driver

这是我的CQL表:

CREATE TABLE user_login (
    userName varchar PRIMARY KEY,
    userId uuid,
    fullName varchar,
    password text,
    blocked boolean
);

我有这个datastax java驱动程序代码

PreparedStatement prepareStmt= instances.getCqlSession().prepare("INSERT INTO "+ AppConstants.KEYSPACE+".user_info(userId, userName, fullName, bizzCateg, userType, blocked) VALUES(?, ?, ?, ?, ?, ?);");

batch.add(prepareStmt.bind(userId, userData.getEmail(), userData.getName(), userData.getBizzCategory(), userData.getUserType(), false));


PreparedStatement pstmtUserLogin = instances.getCqlSession().prepare("INSERT INTO "+ AppConstants.KEYSPACE+".user_login(userName, userId, fullName, password, blocked) VALUES(?, ?, ?, ?, ?) IF NOT EXIST");

batch.add(pstmtUserLogin.bind(userData.getEmail(), userId, userData.getName(), passwordEncoder.encode(userData.getPwd()), false));
            instances.getCqlSession().executeAsync(batch);

这里的问题是,如果我删除IF NOT EXIST所有工作正常,但如果把它放回去,它只是不在表中插入记录,也不会抛出任何错误。

那我怎么知道我正在插入重复的userName

我正在使用cassandra 2.0.1

2 个答案:

答案 0 :(得分:12)

使用INSERT... IF NOT EXISTS,然后您可以使用ResultSet#wasApplied()检查结果:

ResultSet rs = session.execute("insert into user (name) values ('foo') if not exists");
System.out.println(rs.wasApplied());

注意:

  • 此CQL查询是一个轻量级事务,具有性能影响。有关详细信息,请参阅this article
  • 您的示例只有一个声明,您不需要批处理

答案 1 :(得分:-5)

看起来你需要一个ACID交易,而简单地说,Cassandra不是ACID。您绝对不能保证在检查用户名是否存在的时间间隔内不会从其他人创建。 除此之外,在CQL标准中INSERT和UPDATE做同样的事情。他们都写了一个“新”记录,标记旧的删除记录。如果有旧记录与否则不重要。 如果您想要动态地验证或创建新用户,我想您可以使用复合密钥用户名+密码,并将查询作为更新,其中username = datum AND password = datum。 这样,如果用户给你一个错误的密码,你的查询就会失败。 如果用户是新用户,则他无法提供“错误”密码,因此他的帐户已创建。 您现在可以测试“alreadysubscribed”这样的字段,您只在首次登录后设置,因此如果“刚创建”用户将丢失