Concurrency OpenRDF Sesame:如何处理锁定?

Concurrency OpenRDF Sesame:如何处理锁定?,concurrency,transactions,sparql,sesame,openrdf,Concurrency,Transactions,Sparql,Sesame,Openrdf,在我的Apache Tomcat服务器上,我有一个OpenRDF Sesame triplestore来处理与用户和文档相关的RDF三元组以及这些实体之间的双向链接: http://local/id/doc/123456 myvocabulary:title "EU Economy" http://local/id/doc/456789 myvocabulary:title "United States Economy" http://local/id/user/JohnDoe myvocab

在我的Apache Tomcat服务器上,我有一个OpenRDF Sesame triplestore来处理与用户和文档相关的RDF三元组以及这些实体之间的双向链接:

http://local/id/doc/123456 myvocabulary:title "EU Economy"
http://local/id/doc/456789 myvocabulary:title "United States Economy"

http://local/id/user/JohnDoe myvocabulary:email "john@doe.com"
http://local/id/user/JohnDoe myvocabylary:hasWritten http://local/id/doc/123456
此三重状态表示用户John Doe使用电子邮件“john@doe.com曾写过《欧盟经济》一书

在多个客户端上运行的Java应用程序通过HTTPRespository使用这样的服务器来插入/更新/删除这样的三元组

问题来自并发连接。如果一个Java客户端删除了书“456789”,而另一个客户端同时将同一本书链接到“John Doe”,那么可能会出现“John Doe”链接到不再存在的书的情况

为了找到解决方案,我做了两次交易。第一个是(T1):

  • (a) 检查账簿id是否存在(即“456789”)

  • (b) 如果是,请将给定的个人资料(即“JohnDoe”)链接到本书

  • (c) 如果否,则返回一个错误

第二个是(T2):

  • (d) 按id删除图书(即“456789”)
问题是,如果序列是(T1,a)(T2,d)(T1,b)(T1,c),那么仍然存在一致性问题

我的问题是:如何处理锁定(如MySQL FOR UPDATE或GET_LOCK)以使用sesame正确隔离此类事务?

较旧版本的sesame(2.7.x及更旧版本)不支持通过HTTP进行事务隔离。在HTTP连接中,事务只是在客户端一起批处理操作,但没有从服务器获得锁,因此在这种情况下无法控制隔离

因此,在较旧的Sesame版本中处理这一问题的唯一方法是在查询中保持健壮性,而不是依赖于完整的数据一致性(在无模式/半结构化数据范式中,这是一个有点奇怪的概念)。例如,在这种特殊情况下,请确保在查询链接到配置文件的书籍时,书籍数据实际上在那里,而不仅仅依赖于引用

然而,在Sesame2.8和更新版本中,HTTP提供了完整的事务隔离支持,并且还可以对每个事务的具体事务隔离级别进行额外的控制。锁定方案取决于您使用的特定triplestore实现

Sesame的本机存储使用乐观锁定,这意味着它假设事务能够进行它想要的更新,并在发生冲突时抛出异常。设置事务的隔离级别控制存储如何处理并发事务的锁定。有更多关于事务处理和可用隔离级别的详细信息。本机存储上事务的默认隔离级别为
SNAPSHOT\u READ

对于您的示例事务:在默认的隔离级别中,T1和T2都会为其查询观察到存储的一致快照,并且在您绘制快照时会显示顺序:T1会看到该书存在,因此会将其添加到概要文件中,T2会将其删除。最终的结果将是概要文件链接到一本不存在的书——但实际上,这在技术上并不是不一致的,因为T2不会对概要文件中是否使用了特定的书进行任何验证。无论使用哪种事务隔离级别,如果在场景中T2在T1之后执行,最终结果将是指向一本不存在的书的链接。如果要确保无法进入这种情况,则需要扩展T2以检查即将删除的书籍是否链接到配置文件,并使隔离级别
快照
可序列化