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相当的东西。
答案 0 :(得分:2)
您可以运行确保进程对等方,验证某个基础T,然后检查事务中数据库的基础T.因此计算复杂或昂贵的代码在对等端处理,而事务函数仅负责基础T验证。
对于符合标准用例的任何内容(例如,您的说明中的示例),Database Functions是正确且规范的答案。
内置:db.fn / cas函数可用,现在记录在http://docs.datomic.com/transactions.html
答案 1 :(得分:1)
关于Felipe的评论“只插入或抛出异常的交易函数”,你能不能只使用内置的see :db.fn/cas吗?