diff options
| author | Aymeric Augustin <aymeric.augustin@m4x.org> | 2014-03-23 23:34:14 +0100 |
|---|---|---|
| committer | Aymeric Augustin <aymeric.augustin@m4x.org> | 2014-04-10 23:22:13 +0200 |
| commit | 1d3d2b9a2458cbf11b7e828fb59b3f2cb73d14fe (patch) | |
| tree | 6d483eacfe8e0e1a1b12c67d12df19ead0cddc7a | |
| parent | 4ea02bdb0dc6776fc29d8164e417469c9ba10f18 (diff) | |
[1.6.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.py | 16 | ||||
| -rw-r--r-- | tests/backends/tests.py | 7 |
2 files changed, 13 insertions, 10 deletions
diff --git a/django/db/transaction.py b/django/db/transaction.py index ae009a40b4..921affc2d8 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 @@ -309,7 +309,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 @@ -330,7 +335,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 0da5cb85e2..e62f564851 100644 --- a/tests/backends/tests.py +++ b/tests/backends/tests.py @@ -611,13 +611,6 @@ class BackendTestCase(TestCase): with self.assertRaises(DatabaseError): cursor.execute(query) - -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): |
