首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Cassandra select和insert原子操作

Cassandra select和insert原子操作
EN

Stack Overflow用户
提问于 2021-05-15 02:13:37
回答 1查看 27关注 0票数 0

如果两台机器使用相同的参数(id和domainEnv)执行下面的python函数,我只希望第一台机器插入列并返回true from function。但在某些情况下,当select和insert都不是原子操作时,两者都返回true。我能得到一些关于如何使它们原子化并只返回一次true的输入吗?.....>代码

代码语言:javascript
运行
复制
maxTTL = 30 * 24 * 60 * 60
cassandraCreateTable = "CREATE TABLE IF NOT EXISTS test.model_deploy (column1 text, column2 text, column3_flag text, modified_date text, primary key(column1));"
cassandraSelectFlag = "SELECT column3_flag FROM test.model_deploy WHERE column1 = ?;"
cassandraInsertQuery = "INSERT INTO test.model_deploy (column1, column2, column_flag, modified_date) values (?, ?, ?, ?) using ttl ?;"

def checkNoColumn1Exists(id, domainEnv):
'''
1. Check if column 1 row with id exists :
a. If not exists -> insert the row and return true
b. If yes -> do nothing and return false
'''
try:
  cassandraCluster = ["....> I have my details entered here"]
  authProvider = PlainTextAuthProvider(username='xxx', password='xxx')
  cluster = Cluster(cassandraCluster, auth_provider=authProvider)
  session = cluster.connect()
  preparedQuery = session.prepare(cassandraSelectFlag)
  insertQuery = session.prepare(cassandraInsertQuery)
  currentTime = str(datetime.datetime.now())
  rows = session.execute(preparedQuery, [id])
  setFlag = 'true'
  if len(rows.current_rows) == 0:
    session.execute(insertQuery, [id, domainEnv, setFlag, currentTime, maxTTL])
    return True
  return False
except Exception as e:
  print(e)
EN

回答 1

Stack Overflow用户

发布于 2021-05-15 12:50:45

我从你的问题中理解到的是,你有两个应用程序运行相同的功能,并且你只想让一个应用程序插入数据。我相信两个应用程序插入的数据是相同的,包括主键和表列的其余部分。

在这种情况下,如果两个应用程序都写入数据,我不会担心。Cassandra是写密集型数据库。使用Cassandra编写代码非常便宜。

现在的问题是哪些数据在表中持久化。如果您还记得,Cassandra中的每个列单元格都与一个时间戳相关联。无论哪个应用程序稍后写入,该数据都将持久化。在压缩时,Cassandra使用单元格的最新时间戳,该时间戳将被持久化。

在使用Cassandra时,我们不必担心原子性。在上面的代码中,您通过执行check-then-act来销毁原子性。

现在,假设两个应用程序将为列的其余部分插入不同的数据,但插入相同的主键。在这种情况下,我们必须更改表定义以添加聚类列。

代码语言:javascript
运行
复制
CREATE TABLE IF NOT EXISTS test.model_deploy 
(
 column1 text, 
 column2 text, 
 column3_flag text, 
 modified_date text, 
 primary key((column1), column2, column3_flag, modified_date)
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67539139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档