Concurrency OpenRDF Sesame:如何处理锁定?
在我的Apache Tomcat服务器上,我有一个OpenRDF Sesame triplestore来处理与用户和文档相关的RDF三元组以及这些实体之间的双向链接: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
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) 如果否,则返回一个错误
- (d) 按id删除图书(即“456789”)
SNAPSHOT\u READ
对于您的示例事务:在默认的隔离级别中,T1和T2都会为其查询观察到存储的一致快照,并且在您绘制快照时会显示顺序:T1会看到该书存在,因此会将其添加到概要文件中,T2会将其删除。最终的结果将是概要文件链接到一本不存在的书——但实际上,这在技术上并不是不一致的,因为T2不会对概要文件中是否使用了特定的书进行任何验证。无论使用哪种事务隔离级别,如果在场景中T2在T1之后执行,最终结果将是指向一本不存在的书的链接。如果要确保无法进入这种情况,则需要扩展T2以检查即将删除的书籍是否链接到配置文件,并使隔离级别快照
或可序列化