mirror of
https://github.com/django/django.git
synced 2025-10-31 09:41:08 +00:00
[1.7.x] Fixed #21239 -- Maintained atomicity when closing the connection.
Refs #15802 -- Reverted #7c657b24 as BaseDatabaseWrapper.close() now
has a proper "finally" clause that may need to preserve self.connection.
Backport of 25860096 from master.
This commit is contained in:
@@ -9,7 +9,7 @@ import time
|
||||
from unittest import skipIf, skipUnless
|
||||
|
||||
from django.db import (connection, transaction,
|
||||
DatabaseError, IntegrityError, OperationalError)
|
||||
DatabaseError, Error, IntegrityError, OperationalError)
|
||||
from django.test import TransactionTestCase, skipIfDBFeature, skipUnlessDBFeature
|
||||
from django.test.utils import IgnoreDeprecationWarningsMixin
|
||||
from django.utils import six
|
||||
@@ -360,6 +360,20 @@ class AtomicErrorsTests(TransactionTestCase):
|
||||
r2.save(force_update=True)
|
||||
self.assertEqual(Reporter.objects.get(pk=r1.pk).last_name, "Calculus")
|
||||
|
||||
@skipUnlessDBFeature('test_db_allows_multiple_connections')
|
||||
def test_atomic_prevents_queries_in_broken_transaction_after_client_close(self):
|
||||
with transaction.atomic():
|
||||
Reporter.objects.create(first_name="Archibald", last_name="Haddock")
|
||||
connection.close()
|
||||
# The connection is closed and the transaction is marked as
|
||||
# needing rollback. This will raise an InterfaceError on databases
|
||||
# that refuse to create cursors on closed connections (PostgreSQL)
|
||||
# and a TransactionManagementError on other databases.
|
||||
with self.assertRaises(Error):
|
||||
Reporter.objects.create(first_name="Cuthbert", last_name="Calculus")
|
||||
# The connection is usable again .
|
||||
self.assertEqual(Reporter.objects.count(), 0)
|
||||
|
||||
|
||||
@skipUnless(connection.vendor == 'mysql', "MySQL-specific behaviors")
|
||||
class AtomicMySQLTests(TransactionTestCase):
|
||||
|
||||
Reference in New Issue
Block a user