乐观锁定或条件更新

Optimistic locking or conditional update

我想实现 "optimistic locking" 中提到的 Optimistic vs. Pessimistic locking

我有以下数据

:foo 
    :hasProp 'bar';
    :hasVersion '3'^^xsd:nonNegativeInteger
.

A会话查询此数据并将信息保存在内存中。 然后它要发布更新。

我只希望更新成功,当传递的版本为“3”时,这意味着自会话读取 :foo 以来未发生任何更新。

有没有一种方法可以使更新查询在传递的版本为 != 3 时失败,但在其他情况下会成功并将 :hasVersion 更新为 '4'^^xsd:nonNegativeInteger,例如 :hasPropbaz

"Fails" 表示没有数据匹配,即您可以使用 FILTER。剩下的就INSERTDELETE对应的数据:

PREFIX : <YOUR_NAMESPACE_HERE>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

INSERT {
  ?s :hasProp "baz" .
  ?s :hasVersion "4"^^xsd:nonNegativeInteger
}
DELETE {
  ?s :hasProp "bar" .
  ?s :hasVersion ?v
}
WHERE{
  ?s :hasVersion ?v
  FILTER(?v = "3"^^xsd:nonNegativeInteger)
}