如何确保数据库中不存在生成的id

Luk*_*wny 0 java concurrency cassandra spring-boot

我想为实体生成唯一的id并将实体存储在Cassandra数据库中(仅当已生成id的实体不存在时).

在id生成之后,我检查db是否有任何具有相同id的实体.如果不是,则保存实体.MyService类的示例代码:

synchronized (MyService.class) {
    do {
        id = generateId();
    } while (myDao.find(id) != null);
    sampleObject.setId(id);
    myDao.create(sampleObject);
}
Run Code Online (Sandbox Code Playgroud)

在MyDao中保存我正在使用的实体:

cassandraOperations.insert(sampleObject);
Run Code Online (Sandbox Code Playgroud)

确保数据库中不存在已生成的id的最佳实践是什么?我觉得这个同步块不是最有效的解决方案.或者也许还有其他方法可以确保只有在数据库中没有具有相同ID的实体时才插入实体?

Chr*_*ink 7

类型1 uuids(timeuuid)保证不会发生冲突,前提是每毫秒(每个主机)创建的uuids少于10k uuids.因此,这是最简单的解决方案,不会影响吞吐量或延迟.如果你使用4型随机uuid(uuid类型),碰撞的可能性小于从你的数据中心下喷发的超级火山,但它不能提供保证timeuuid.

如果需要,还可以IF NOT EXISTS在查询中使用带有子句的轻量级事务.

INSERT INTO keyspace_name.table_name
  ( identifier, column_name...)
  VALUES ( value, value ... ) IF NOT EXISTS
Run Code Online (Sandbox Code Playgroud)

如果行尚不存在,这将仅应用突变.查询将返回一个applied字段,告诉您它是否成功.如果另一个插入相同的东西只有一个会工作.

https://docs.datastax.com/en/cql/3.1/cql/cql_reference/insert_r.html#reference_ds_gp2_1jp_xj__if-not-exists

这会慢一些因为它使用了paxos,它会在你的集群周围完成多次跳跃.