如何在Spring托管事务

时间:2015-05-07 18:47:10

标签: neo4j spring-data-neo4j

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

(p为人) - [:用途] - 将(S:SIM_Card {电话号码:" XXX"})

其算法如下:

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

-if yes获取此节点,如果没有创建它,

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

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

不幸的是,当有很多请求发生时,我在数据库SIM_Cards中附加了多个Person。我假设该方法由两个并发线程执行。读取数据库并使用相同的电话号码搜索SIM_Card,并且两者都获得了数据库中没有此类SIM_Card的信息,因此他们创建了这些信息,然后他们将两个单独的Person附加到它们。 PhoneNuber对于SIM_Card来说是唯一的,所以最终只有一个SIM_Card,但是剩下两个人,这不是预期的情况。 为了解决这个问题,我想在单独的Transaction中创建SIM_Card,然后创建Person并在另一个事务中附加到此SIM_Card。在创建Person之前,我将检查是否已经连接了Person。但是,就在那次检查之前,我想在SIM_Card上手动设置一个写锁,我假设其他交易将无法同时检查是否有任何人连接到此SIM_Card。它必须等待锁定被释放然后才会看到这个SIM_Card附加了Person并且不会创建另一个。

要实现这一点,我必须以某种方式在@Transactional注释方法中设置Neo4j锁,我不知道该怎么做。我非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

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