创建索引时出现死锁

1 投票
1 回答
633 浏览
提问于 2025-04-17 21:36

我尝试用py2neo 1.6.2和neo4j 2.0.1创建一个索引,使用的是Cypher查询:

graph_db = neo4j.GraphDatabaseService()
query = "CREATE INDEX ON :Label(prop)"
neo4j.CypherQuery(graph_db, query).run()

这个查询在neo4j的网页界面上运行得很好,但在py2neo中却出现了死锁错误:


py2neo.neo4j.DeadlockDetectedException: 别慌。

检测到并避免了一个死锁情况。这意味着有两个或更多的事务在持有锁的同时,想要等待对方持有的锁,这样就会导致这些事务之间发生死锁。为了避免这种死锁,系统抛出了这个异常,而不是让事务陷入死锁。

想了解如何避免这种情况,可以查看Neo4j手册中的死锁部分:http://docs.neo4j.org/chunked/stable/transactions-deadlocks.html

详细信息:'Transaction(15438, owner:"qtp1927594840-9525")[STATUS_ACTIVE,Resources=1] 不能等待资源 RWLock[SchemaLock],因为 => Transaction(15438, owner:"qtp1927594840-9525")[STATUS_ACTIVE,Resources=1] <-[:HELD_BY]- RWLock[SchemaLock] <-[:WAITING_FOR]- Transaction(15233, owner:"qtp1927594840-9503")[STATUS_ACTIVE,Resources=1] <-[:HELD_BY]- RWLock[SchemaLock]'。


无论标签是否存在,请求通常都会失败。

1 个回答

1

从死锁图来看,这看起来像是2.0.1版本的一个bug。你在数据库上除了运行这个特定的查询之外,还有做其他操作吗?还是说你只是启动了一个新的数据库,然后运行你提供的代码?

无论如何,既然在Neo4j浏览器中可以正常工作,我建议你换用事务API,因为浏览器就是用这个的。Py2neo支持这个功能,叫做“Cypher事务”,具体的说明可以在这里找到:

http://book.py2neo.org/en/latest/cypher/#id2

撰写回答