首先我会解释为什么我要手动设置写锁。我在基于 Spring Data Neo4j 的 Web 服务应用程序中使用 Neo4j 数据库。事务由Spring管理,我只使用@Transactional注释。但是,我对特定用例有问题,这会导致数据库不一致。我有一个事务性方法,其目的是在数据库中创建这样的节点/关系:
(p:人)-[:使用]->(s:SIM_Card{phoneNumber:"xxx"})
其算法如下:
-检查数据库中是否已经存在具有特定电话号码(唯一)的SIM_Card(通过@Query进行密码查询),
-如果是,则获取此节点,如果否,则创建它,
-检查是否有任何人通过USES关系附加到此SIM_Card(密码查询),
- 如果没有这样的人,则创建它并附加到 SIM_Card。
不幸的是,当有很多请求时,我的数据库 SIM_Cards 会附加到多个人。我假设该方法由两个并发线程执行。两者都读取数据库并搜索具有相同电话号码的SIM_Card,并且都得到数据库中还没有这样的SIM_Card的信息,因此它们创建它们,然后将两个单独的Person附加到它们。 PhoneNuber对于SIM_Card来说是唯一的,因此最终只有一张SIM_Card,但仍然有两个Person,这不是预期的情况。
为了解决这个问题,我想在单独的事务中创建 SIM_Card,然后创建 Person 并在另一个事务中附加到此 SIM_Card。在创建 Person 之前,我将检查是否没有已附加的 Person。然而,就在该检查之前,我想在 SIM_Card 上手动设置写入锁定,并且我假设其他事务将无法同时检查是否有/或没有任何人连接到该 SIM_Card。它必须等待锁被释放,然后它会看到该 SIM_Card 已附加了 Person,并且不会创建另一张 SIM_Card。
为了实现这一点,我必须以某种方式获得在 @Transactional 带注释的方法中设置 Neo4j 锁的能力,但我不知道该怎么做。我将衷心感谢您的帮助。
我想你必须放弃@Transactional
在这种情况下,电线GraphDatabaseService
实例到您的存储库(或服务)中,然后启动事务并手动获取写锁(http://neo4j.com/docs/stable/javadocs/org/neo4j/graphdb/Transaction.html#acquireWriteLock(org.neo4j.graphdb.PropertyContainer) http://neo4j.com/docs/stable/javadocs/org/neo4j/graphdb/Transaction.html#acquireWriteLock(org.neo4j.graphdb.PropertyContainer)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)