Тупик в asyncpg - как решить? - PullRequest
       71

Тупик в asyncpg - как решить?

0 голосов
/ 02 августа 2020

У меня есть простая инструкция выполнения, которая обновляется, если выполняется условие. Я понимаю, что тупик - это когда оба процесса A и B борются за одни и те же ресурсы, и оба они полагаются на другой, чтобы fini sh.

Однако у меня есть простой оператор 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?

Спасибо за ваш время.

...