Opened 7 years ago
Last modified 16 months ago
#30448 new Bug
close_if_unusable_or_obsolete should skip connections in atomic block for autocommit check
| Reported by: | Daniel Hahler | Owned by: | |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | 2.2 |
| Severity: | Normal | Keywords: | |
| Cc: | Jon Janzen, Evstifeev Roman, Anders Kaseorg | Triage Stage: | Accepted |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | yes | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
Via https://github.com/django/channels/issues/1091#issuecomment-489488831 I have noticed that close_if_unusable_or_obsolete will close the DB connection used in tests, which has entered an atomic block (via TestCase).
channel's DatabaseSyncToAsync calls close_if_unusable_or_obsolete here.
The following patch might make sense:
diff --git c/django/db/backends/base/base.py i/django/db/backends/base/base.py
index 9fa03cc0ee..f9ca0f8464 100644
--- c/django/db/backends/base/base.py
+++ i/django/db/backends/base/base.py
@@ -497,7 +497,10 @@ def close_if_unusable_or_obsolete(self):
if self.connection is not None:
# If the application didn't restore the original autocommit setting,
# don't take chances, drop the connection.
- if self.get_autocommit() != self.settings_dict['AUTOCOMMIT']:
+ if (
+ not self.in_atomic_block and
+ self.get_autocommit() != self.settings_dict["AUTOCOMMIT"]
+ ):
self.close()
return
Change History (8)
comment:1 by , 7 years ago
| Triage Stage: | Unreviewed → Accepted |
|---|
comment:2 by , 6 years ago
Created https://github.com/django/django/pull/11769.
but I agree that not considering
self.in_atomic_blockin the check againstsettings_dict["AUTOCOMMIT"]is way too naive to determine the connection is unusable or obsolete.
Not sure I understand that correctly: do you think the patch makes sense, or is still to naive?
comment:3 by , 5 years ago
| Has patch: | set |
|---|---|
| Needs tests: | set |
| Owner: | changed from to |
| Status: | new → assigned |
comment:4 by , 21 months ago
| Owner: | removed |
|---|---|
| Status: | assigned → new |
comment:5 by , 18 months ago
| Cc: | added |
|---|
comment:6 by , 16 months ago
| Cc: | added |
|---|
close_if_unusable_or_obsoleteis certainly an internal API but I agree that not consideringself.in_atomic_blockin the check againstsettings_dict["AUTOCOMMIT"]is way too naive to determine the connection is unusable or obsolete.