MEMSQL - UPSERT IF(记录版本控制)

时间:2016-09-05 20:35:46

标签: memsql

我有一系列用户创建和用户更新事件。

每个事件包含事件类型(创建或更新)和整个用户实体,即UserID,用户名,电子邮件等.. 加上版本号,表示用户版本,以便创建版本0 ,第1版更新版本等..

事件不一定是有序的,因此我可能会在版本1之前获得版本2 AND 也可以并行处理它们,以便在我尝试保留版本1时,其他事件流处理器尝试在并行版本2中保留。

我想用原子条件(IF)执行 UPSERT ,这样成功更新只有在VERSION_IN_DB< NEW_VERSION_IM_TRYING_TO_UPDATE。 如果数据库不包含任何版本,则只需插入用户记录。 (原子)

这一切都应该确保在所有情况下只保留最新版本的用户 - 多线程,无序事件流等。

知道我怎么能用MEMSQL做到这一点?

1 个答案:

答案 0 :(得分:2)

这样的事情应该有效:

INSERT INTO <table> VALUES (...) ON DUPLICATE KEY UPDATE 
    col = IF(VALUES(version) > version, VALUES(col), col), 
    <repeat for other columns>, 
    version = IF(VALUES(version) > version, VALUES(version), version) 

ON DUPLICATE KEY UPDATE子句中的所有逻辑都以原子方式运行(在INSERT提交的事务提交之前,没有其他人可以修改该行。)