我有一个nodejs项目,存在一些并发问题。我有一个处理程序,它读取更新后的状态,然后将其写入同一节点的 neo4j 数据库。当两个并发进程尝试运行相同的处理程序时,进程从数据库读取状态,然后一个进程将更新后的状态写入另一个进程之上。所以我想在读取之前锁定并在写入之后解锁。
neo4j 有为此准备的东西吗? 我找到了 this 并尝试使用它来读取和写入查询:
// read
MATCH (n:Account {id: $accountId})
CALL apoc.lock.nodes([n]) // Attempt to lock the account node
RETURN account.balance
// write
MATCH (n:Account {id: $accountId})
CALL apoc.lock.nodes([n]) // Lock the account node
SET n.balance = n.balance + $amount
RETURN account
// locks are released here??
但没有结果,也没有足够的文档来了解如何使用它。
任何查询示例都很棒!预先感谢您!
为了提高效率,neo4j 默认使用
read-committed
隔离级别,该级别不会对事务从数据库读取的所有内容加锁。但是,事务写入的数据从事务中的该点开始自动锁定。 请参阅此处了解更多详情。
apoc.lock.nodes
过程在提供的列表中的每个节点上放置写锁,但锁在调用该过程的事务结束时释放。因此,您的“处理程序”必须在“同一事务”中执行您的
read
和 write
查询,以防止并发执行相互干扰。请参阅适用于您的编程语言的neo4j 驱动程序的文档,了解如何在同一事务中处理查询。 此外,您的
write
查询不需要调用 apoc.lock.nodes
,因为紧随其后的
SET
子句无论如何都会锁定 n
节点(如果事务之前没有锁定它)。请参阅docs中的直接依赖关系的描述和示例。