如果两台机器使用相同的参数(id和domainEnv)执行下面的python函数,我只希望第一台机器插入列并返回true from function。但在某些情况下,当select和insert都不是原子操作时,两者都返回true。我能得到一些关于如何使它们原子化并只返回一次true的输入吗?.....>代码
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)
发布于 2021-05-15 12:50:45
我从你的问题中理解到的是,你有两个应用程序运行相同的功能,并且你只想让一个应用程序插入数据。我相信两个应用程序插入的数据是相同的,包括主键和表列的其余部分。
在这种情况下,如果两个应用程序都写入数据,我不会担心。Cassandra是写密集型数据库。使用Cassandra编写代码非常便宜。
现在的问题是哪些数据在表中持久化。如果您还记得,Cassandra中的每个列单元格都与一个时间戳相关联。无论哪个应用程序稍后写入,该数据都将持久化。在压缩时,Cassandra使用单元格的最新时间戳,该时间戳将被持久化。
在使用Cassandra时,我们不必担心原子性。在上面的代码中,您通过执行check-then-act来销毁原子性。
现在,假设两个应用程序将为列的其余部分插入不同的数据,但插入相同的主键。在这种情况下,我们必须更改表定义以添加聚类列。
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)
);
https://stackoverflow.com/questions/67539139
复制相似问题