summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAymeric Augustin <aymeric.augustin@m4x.org>2014-03-23 23:34:14 +0100
committerAymeric Augustin <aymeric.augustin@m4x.org>2014-04-10 23:18:36 +0200
commit2ad0bc132a6f70a128d8e1fec689c6a474ddde89 (patch)
tree4d7eeed88e0c5351f3f289040208770b92f6d33f
parent2e42c859da42a871244aca36162a0aad2b63c02b (diff)
[1.7.x] Fixed #21202 -- Maintained atomicity when the server disconnects.
Thanks intgr for the report. This commit doesn't include a test because I don't know how to emulate a database disconnection in a cross-database compatible way. Also simplified a 'backends' test that was constrained by this problem. Backport of 81761508 from master
-rw-r--r--django/db/transaction.py16
-rw-r--r--tests/backends/tests.py7
2 files changed, 13 insertions, 10 deletions
diff --git a/django/db/transaction.py b/django/db/transaction.py
index 49ffb7b9f2..1a3699121f 100644
--- a/django/db/transaction.py
+++ b/django/db/transaction.py
@@ -18,7 +18,7 @@ from functools import wraps
from django.db import (
connections, DEFAULT_DB_ALIAS,
- DatabaseError, ProgrammingError)
+ DatabaseError, Error, ProgrammingError)
from django.utils.decorators import available_attrs
from django.utils.deprecation import RemovedInDjango18Warning
@@ -332,7 +332,12 @@ class Atomic(object):
try:
connection.commit()
except DatabaseError:
- connection.rollback()
+ try:
+ connection.rollback()
+ except Error:
+ # Error during rollback means the connection was
+ # closed. Clean up in case the server dropped it.
+ connection.close()
raise
else:
# This flag will be set to True again if there isn't a savepoint
@@ -353,7 +358,12 @@ class Atomic(object):
connection.needs_rollback = True
else:
# Roll back transaction
- connection.rollback()
+ try:
+ connection.rollback()
+ except Error:
+ # Error during rollback means the connection was
+ # closed. Clean up in case the server dropped it.
+ connection.close()
finally:
# Outermost block exit when autocommit was enabled.
diff --git a/tests/backends/tests.py b/tests/backends/tests.py
index e6a557ba6b..2fcb3d6063 100644
--- a/tests/backends/tests.py
+++ b/tests/backends/tests.py
@@ -663,13 +663,6 @@ class BackendTestCase(TestCase):
self.assertTrue(isinstance(cursor, CursorWrapper))
self.assertTrue(cursor.closed)
-
-class IsUsableTests(TransactionTestCase):
- # Avoid using a regular TestCase because Django really dislikes closing
- # the database connection inside a transaction at this point (#21202).
-
- available_apps = []
-
# Unfortunately with sqlite3 the in-memory test database cannot be closed.
@skipUnlessDBFeature('test_db_allows_multiple_connections')
def test_is_usable_after_database_disconnects(self):