首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Spring托管事务中手动管理Neo4j锁

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

Stack Overflow用户
提问于 2015-05-08 02:47:10
回答 1查看 294关注 0票数 3

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

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

其算法如下:

-check如果数据库中已存在具有特定电话号码(唯一)的查询(通过@ SIM_Card进行循环查询),

-if是获取此节点,如果否,则创建它,

-check如果有任何人附加到此SIM_Card并具有使用关系(循环查询),

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

不幸的是,当有许多请求时,我的数据库SIM_Cards中会有附加到多个人的请求。我假设该方法由两个并发线程执行。两者都读取数据库并搜索具有相同电话号码的SIM_Card,并且都得到数据库中还没有这样的SIM_Card的信息,所以他们创建它们,然后将两个不同的人附加到它们上。PhoneNuber对于SIM_Card是唯一的,所以最终只有一个SIM_Card,但还有两个人,这不是预期的情况。为了解决这个问题,我想在单独的事务中创建SIM_Card,然后在另一个事务中创建Person并附加到此SIM_Card。在创建人员之前,我将检查是否没有人员已附加。然而,就在检查之前,我想在SIM_Card上手动设置一个写锁,我假设如果有/或没有任何人连接到此SIM_Card,则其他事务将无法同时检查。它将不得不等待锁被释放,然后它将看到这个SIM_Card附加了Person,并且不会创建另一个锁。

为了实现这一点,我必须以某种方式在带注释的@Transactional方法中设置Neo4j锁,但我不知道如何做到这一点。我真的很感谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2015-05-11 05:34:53

我认为在这种情况下,您必须放弃@Transactional,将GraphDatabaseService实例连接到您的存储库(或服务)中,并启动事务并手动获取写锁(http://neo4j.com/docs/stable/javadocs/org/neo4j/graphdb/Transaction.html#acquireWriteLock(org.neo4j.graphdb.PropertyContainer)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30109292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档