summaryrefslogtreecommitdiff
path: root/django/db/transaction.py
diff options
context:
space:
mode:
Diffstat (limited to 'django/db/transaction.py')
-rw-r--r--django/db/transaction.py16
1 files changed, 13 insertions, 3 deletions
diff --git a/django/db/transaction.py b/django/db/transaction.py
index 78f8423150..ae009a40b4 100644
--- a/django/db/transaction.py
+++ b/django/db/transaction.py
@@ -290,7 +290,12 @@ class Atomic(object):
connection.in_atomic_block = False
try:
- if exc_type is None and not connection.needs_rollback:
+ if connection.closed_in_transaction:
+ # The database will perform a rollback by itself.
+ # Wait until we exit the outermost block.
+ pass
+
+ elif exc_type is None and not connection.needs_rollback:
if connection.in_atomic_block:
# Release savepoint if there is one
if sid is not None:
@@ -330,13 +335,18 @@ class Atomic(object):
finally:
# Outermost block exit when autocommit was enabled.
if not connection.in_atomic_block:
- if connection.features.autocommits_when_autocommit_is_off:
+ if connection.closed_in_transaction:
+ connection.connection = None
+ elif connection.features.autocommits_when_autocommit_is_off:
connection.autocommit = True
else:
connection.set_autocommit(True)
# Outermost block exit when autocommit was disabled.
elif not connection.savepoint_ids and not connection.commit_on_exit:
- connection.in_atomic_block = False
+ if connection.closed_in_transaction:
+ connection.connection = None
+ else:
+ connection.in_atomic_block = False
def __call__(self, func):
@wraps(func, assigned=available_attrs(func))