如何使用Datomic数据库执行原子操作?

时间:2014-07-16 16:40:19

标签: database atomic datomic

TL; DR我想要这个功能:"如果Y = 10"则更新Y,否则失败。

示例:假设时间线为T1,T2和T3。在时间T1,实体X包含属性Y = 10,在时间T2,属性是Y = 14。我的目标是在Y中应用复杂的操作(假设此操作是1的总和)。我在T1读取了Y的值,即10并将该值放入要处理的队列中。在T3,当复杂操作完成并且结果为11时,我将更新属性Y.如果我只是更新属性,值为Y = 14在T2,它将被错误地丢弃。但是,在T3,在更新时,我想确定最终值是Y = 10,否则我必须在T2处读取Y = 14进行重新处理。

我知道Database Functions进行原子读取 - 修改 - 更新处理,但是如果操作很复杂并且需要分配(放入队列之后),这种方法并不好。

我想要的是与DynamoDB中的Conditional Writes相当的东西。

2 个答案:

答案 0 :(得分:2)

您可以运行确保进程对等方,验证某个基础T,然后检查事务中数据库的基础T.因此计算复杂或昂贵的代码在对等端处理,而事务函数仅负责基础T验证。

对于符合标准用例的任何内容(例如,您的说明中的示例),Database Functions是正确且规范的答案。

内置:db.fn / cas函数可用,现在记录在http://docs.datomic.com/transactions.html

答案 1 :(得分:1)

关于Felipe的评论“只插入或抛出异常的交易函数”,你能不能只使用内置的see :db.fn/cas吗?