うーん、いい質問です。ドキュメントでは、適切な例外は TransactionManagementError コード>
:
ただし、ソースコード そうではないという強い手がかりを与えます:
class TransactionManagementError(ProgrammingError):
"""Transaction management is used improperly."""
pass
これは ProgrammingError
であることに注意してください。
、これは実際にプログラマーのエラーを示すために使用されます(つまり、「不適切に使用された」)。
psycopg(PostgreSQLサポートに使用されるPythonアダプター)のドキュメントを見ると、 psycopg2.extensions.TransactionRollbackError
:
しかし、Djangoはそれで何をしますか?ええと、ここに記載されている
、標準のPython DB API 2.0例外を同等のDjangoでラップし、 __ cause __
を設定します。 元の例外の属性。したがって、以下はおそらくあなたが行うことができる最も具体的なチェックです:
from django.db import OperationalError
from psycopg2.extensions import TransactionRollbackError
for retries in range(0, 3):
try:
with transaction.atomic():
MyModel.objects.update(foo='bar')
except OperationalError as e:
if e.__cause__.__class__ == TransactionRollbackError:
continue
else:
raise
else:
break
PostgreSQLによって公開されたエラーの詳細に応じて(eから入手可能.__cause__。diag
)さらに具体的なテストを書くことができるかもしれません。
ただし、一般的に、Python DB API 2.0のドキュメントには、OperationalErrorと記載されています。
は確かにトランザクションの問題の正しい例外タイプであるため、それをキャッチすることは、データベースに依存しない合理的に効果的なソリューションになることを願っています。