错误“DeadlockDetectedException: ForsetiClient[0] 无法获取排他锁…”的解释
在特定场景下,可能会遇到 DeadlockDetectedException 错误,并且其行为已在此处描述:https://neo4j.ac.cn/docs/java-reference/current/transaction-management/#transactions-deadlocks。当检测到死锁时,一种选择是简单地重试该语句。由于死锁检测错误是可安全重试的错误,并且用户应在所有应用程序代码中处理这些错误,因为任何时候都可能出现合法的死锁,因此这种行为实际上是为提高可伸缩性而设计的。以下描述了一个可以演示/复现死锁的场景。
时间 | 事务 | Cypher 语句 |
---|---|---|
08:00:01 |
tx1001 |
开始 |
08:00:02 |
tx1001 |
MATCH (n:Person {name:'Tom Hanks'}) set n.age=59; |
08:00:03 |
tx1002 |
开始 |
08:00:04 |
tx1002 |
MATCH (n:Movie {title:'Cast Away'}) set n.gross=233630478; |
08:00:05 |
tx1001 |
MATCH (n:Movie {title:'Cast Away'}) set n.budget=90000000; |
08:00:06 |
tx1002 |
MATCH (n:Person {name:'Tom Hanks'}) set n.residence=California; |
在上述场景中,事务 tx1001 在 08:00:01 启动,随后在 08:00:02 对“Tom Hanks”的 Person
节点执行更新,并将 age 定义为 59,导致在该节点上放置了一个写入锁。
事务 tx1002 随后在 08:00:03 启动,并在 08:00:04 对《荒岛余生》的 Movie
节点执行更新,并将 gross 定义为 233630478,导致在该节点上放置了一个写入锁。
事务 tx1001 在 08:00:05 尝试更新《荒岛余生》的 Movie
节点,但由于 08:00:04 的事务在该节点上持有写入锁而被阻塞。
事务 tx1002 在 08:00:06 尝试更新“Tom Hanks”的 Person
节点,但由于 08:00:02 的事务在该节点上持有写入锁而被阻塞。
由于最后两条语句相互等待,检测到死锁,并且 08:00:06 的事务被以下错误中止
DeadlockDetectedException: ForsetiClient[0] can't acquire ExclusiveLock{owner=ForsetiClient[1]} on NODE(200153), because holders of that lock are waiting for ForsetiClient[0]. Wait list:ExclusiveLock[ Client[1] waits for [0]]
此页面有帮助吗?