0

以下是使用gocql驱动程序的查询:

    insertQueryString = "INSERT INTO my_table (id_1, id_2, textDetails) " + "VALUES (?, ?, ?) IF NOT EXISTS"
    cassandra.Session.Query(insertQueryString, 
    id1,                            
    id2,        
    myTextDetails).Exec();

Cassandra 3.0 中的表模式是:

CREATE      TABLE  IF    NOT    EXISTS my_table (
  id_1                   UUID,
  id_2                   UUID,
  textDetails            TEXT,
  PRIMARY KEY (id_1, id_2)
);

我们有一个INSERT在多个 Go 例程(http 处理程序)上发起的上述查询的场景,具有相同的列值组合(id_1, id_2),然后,

Cassandra 是否确保只有第一个 INSERT操作成功执行?并使用数据库中INSERT的现有值组合错误输出后续请求(id_1, id_2)

4

1 回答 1

1

关于 Cassandra 中唯一的 PRIMARY KEYs 和并发操作有一个普遍的说法:

“最后写入获胜。”

Cassandra 是否确保只有第一个 INSERT 操作成功执行?并在数据库中使用 (id_1, id_2) 的现有值组合错误输出后续 INSERT 请求

通常,没有。Cassandra 通常会确保成功执行特定主键的所有操作。

但是,在这种使用轻量级事务的情况下,答案是“是”。在这种情况下,第一个写入将“获胜”,并且该IF NOT EXISTS子句将阻止另一个写入成功。

仅供参考 - 您会在性能方面受到一些影响,因为轻量级事务会多次往返数据库。

于 2021-04-27T17:11:00.697 回答