在我的 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 ?