gpt4 book ai didi

neo4j - 如何在 Spring 托管事务中手动管理 Neo4j 锁

转载 作者:行者123 更新时间:2023-12-04 15:43:18 26 4
gpt4 key购买 nike

首先我会解释为什么我想手动设置写锁。我在基于 Spring Data Neo4j 的 Web 服务应用程序中使用 Neo4j 数据库。事务由 Spring 管理,我只是使用 @Transactional 注解。但是,我对导致数据库不一致的特定用例有疑问。我有一个事务性的方法,它的目的是在数据库中创建这样的节点/关系:

(p:Person)-[:USES]->(s:SIM_Card{phoneNumber:"xxx"})

其算法如下:

-检查数据库中是否已经存在具有特定电话号码(唯一)的SIM_Card(通过@Query进行密码查询),

-如果是得到这个节点,如果没有创建它,

-检查是否有任何人附加到此 SIM_Card 具有 USES 关系(密码查询),

-如果没有这样的人创建它并附加到 SIM_Card。

不幸的是,当有很多请求时,我在数据库 SIM_Cards 中碰巧有多个 Person。我假设该方法由两个并发线程执行。两者都读取数据库并搜索具有相同电话号码的 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)

关于neo4j - 如何在 Spring 托管事务中手动管理 Neo4j 锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30109292/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com