|
15 | 15 | """ |
16 | 16 | pg8000 IDBDriver implementations. |
17 | 17 | """ |
18 | | - |
19 | | -from __future__ import absolute_import |
20 | | -from __future__ import print_function |
21 | | - |
22 | 18 | from collections import deque |
23 | 19 |
|
24 | 20 | from zope.interface import implementer |
25 | 21 |
|
26 | 22 | from relstorage._compat import number_types |
27 | 23 |
|
| 24 | +from ...._compat import WIN |
28 | 25 | from ...interfaces import IDBDriver |
29 | 26 | from ...sql import Compiler |
30 | | - |
31 | 27 | from . import AbstractPostgreSQLDriver |
32 | 28 | from . import PostgreSQLDialect |
33 | 29 | from ._lobject import LobConnectionMixin |
34 | 30 |
|
35 | | - |
36 | 31 | __all__ = [ |
37 | 32 | 'PG8000Driver', |
38 | 33 | ] |
@@ -249,3 +244,17 @@ def connection_may_need_commit(self, conn): |
249 | 244 |
|
250 | 245 | def _get_exception_pgcode(self, exc): |
251 | 246 | return exc.args[0]['C'] |
| 247 | + |
| 248 | + if WIN: |
| 249 | + def exception_is_deadlock(self, exc): |
| 250 | + is_deadlock = super().exception_is_deadlock(exc) |
| 251 | + if is_deadlock: |
| 252 | + return is_deadlock |
| 253 | + # pg8000 raises pg8000.dbapi.ProgrammingError, which is a DatabaseError. |
| 254 | + # We've seen both |
| 255 | + # 40P01 - deadlock_detected (Transaction Rollback) |
| 256 | + # 55P03 - lock_not_available (Object Not In Prerequisite State) |
| 257 | + # ERRCODE_DEADLOCK is the first one, checked by super. |
| 258 | + if isinstance(exc, self.driver_module.DatabaseError): |
| 259 | + return self._get_exception_pgcode(exc) == '55P03' |
| 260 | + return None |
0 commit comments