हम्म, अच्छा सवाल। दस्तावेज़ीकरण का तात्पर्य है कि उपयुक्त अपवाद एक TransactionManagementErrorकोड होगा। कोड>
:
हालांकि, स्रोत कोड एक मजबूत सुराग देता है कि यह नहीं है:
class TransactionManagementError(ProgrammingError):
"""Transaction management is used improperly."""
pass
ध्यान दें कि यह एक ProgrammingError
है।
, जो वास्तव में प्रोग्रामर त्रुटि को इंगित करने के लिए उपयोग किया जाता है (अर्थात "अनुचित तरीके से उपयोग किया गया")।
यदि हम psycopg (Python एडेप्टर का उपयोग PostgreSQL समर्थन के लिए किया जाता है) के लिए प्रलेखन को देखते हैं, तो हम देखते हैं कि यह एक psycopg2.extensions.TransactionRollbackError
:
लेकिन Django इसके साथ क्या करता है? ठीक है, जैसा कि यहां प्रलेखित है
, यह Django समकक्षों में मानक पायथन डीबी एपीआई 2.0 अपवादों को लपेटता है, और __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
) इससे भी अधिक विशिष्ट परीक्षण लिखना संभव हो सकता है।
आम तौर पर, हालांकि, पायथन डीबी एपीआई 2.0 प्रलेखन में कहा गया है कि OperationalError
लेन-देन के मुद्दों के लिए वास्तव में सही अपवाद प्रकार है, इसलिए उम्मीद है कि इसे पकड़ना एक उचित प्रभावी डेटाबेस-अज्ञेय समाधान होगा।