【问题标题】:Perform insert query on a Go-routine在 Go-routine 上执行插入查询
【发布时间】:2021-07-21 01:03:59
【问题描述】:

下面是使用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-routines(http处理程序)上发起的,具有(id_1, id_2)的相同列值组合, 那么,

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

【问题讨论】:

    标签: database cassandra cql gocql


    【解决方案1】:

    关于 Cassandra 中唯一的 PRIMARY KEY 和并发操作有一句俗语:

    “最后写入获胜。”

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

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

    但是,在这种情况下,使用lightweight transaction,答案是“是”。在这种情况下,第一个写入将“获胜”,IF NOT EXISTS 子句将阻止另一个写入成功。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-05
      • 1970-01-01
      • 2020-02-22
      • 1970-01-01
      相关资源
      最近更新 更多