首页 > 解决方案 > asyncpg 中的死锁 - 如何解决?

问题描述

我有一个简单的执行语句,如果满足条件就会更新。我理解死锁是当进程 A 和 B 争夺相同的资源时,它们都依赖另一个来完成。

但是,我只有一个简单的 UPDATE 语句,我找不到死锁的其他来源 - 但我只是对这条线如何导致死锁语句感到困惑:

    await self.bot.pg_con.execute("UPDATE gameusers SET raid_pass = raid_pass + 1 WHERE raid_pass < 10")
  File "/home/debian/.local/lib/python3.7/site-packages/asyncpg/pool.py", line 518, in execute
    return await con.execute(query, *args, timeout=timeout)
  File "/home/debian/.local/lib/python3.7/site-packages/asyncpg/connection.py", line 272, in execute
    return await self._protocol.query(query, timeout)
  File "asyncpg/protocol/protocol.pyx", line 316, in query
asyncpg.exceptions.DeadlockDetectedError: deadlock detected
DETAIL:  Process 24326 waits for ShareLock on transaction 75790925; blocked by process 24240.
Process 24240 waits for ShareLock on transaction 75790924; blocked by process 24326.

它怎么会出现在一个简单的 UPDATE 语句中?

谢谢你的时间。

标签: pythonpostgresqlasyncpg

解决方案


推荐阅读