From 5ca82ff71baa9d749c98ef68e8f8814cf7afcf5d Mon Sep 17 00:00:00 2001 From: Aymeric Augustin Date: Fri, 21 Mar 2014 18:48:57 +0100 Subject: [PATCH] [1.7.x] Fixed #23089 -- Fixed transaction handling in two management commands. Previously, when createcachetable and flush operated on non-default databases, they weren't atomic. Backport of 753a22a635 from master --- django/core/management/commands/createcachetable.py | 2 +- django/core/management/commands/flush.py | 2 +- docs/releases/1.6.6.txt | 4 ++++ tests/cache/tests.py | 8 +++++--- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/django/core/management/commands/createcachetable.py b/django/core/management/commands/createcachetable.py index 909a5d08c8e..8a9d0829c5c 100644 --- a/django/core/management/commands/createcachetable.py +++ b/django/core/management/commands/createcachetable.py @@ -71,7 +71,7 @@ class Command(BaseCommand): for i, line in enumerate(table_output): full_statement.append(' %s%s' % (line, ',' if i < len(table_output) - 1 else '')) full_statement.append(');') - with transaction.commit_on_success_unless_managed(): + with transaction.atomic(using=database): with connection.cursor() as curs: try: curs.execute("\n".join(full_statement)) diff --git a/django/core/management/commands/flush.py b/django/core/management/commands/flush.py index 1c21495b353..32c7aa0743b 100644 --- a/django/core/management/commands/flush.py +++ b/django/core/management/commands/flush.py @@ -62,7 +62,7 @@ Are you sure you want to do this? if confirm == 'yes': try: - with transaction.commit_on_success_unless_managed(): + with transaction.atomic(using=db): with connection.cursor() as cursor: for sql in sql_list: cursor.execute(sql) diff --git a/docs/releases/1.6.6.txt b/docs/releases/1.6.6.txt index c61823bfdc0..c8c7a037c02 100644 --- a/docs/releases/1.6.6.txt +++ b/docs/releases/1.6.6.txt @@ -22,3 +22,7 @@ Bugfixes * Restored ``pre_delete`` signals for ``GenericRelation`` cascade deletion (`#22998 `_). + +* Fixed transaction handling when specifying non-default database in + ``createcachetable`` and ``flush`` + (`#23089 `_). diff --git a/tests/cache/tests.py b/tests/cache/tests.py index 2c541a304d0..21a92c3b46d 100644 --- a/tests/cache/tests.py +++ b/tests/cache/tests.py @@ -989,9 +989,11 @@ class CreateCacheTableForDBCacheTests(TestCase): # cache table should be created on 'other' # Queries: # 1: check table doesn't already exist - # 2: create the table - # 3: create the index - with self.assertNumQueries(3, using='other'): + # 2: create savepoint + # 3: create the table + # 4: create the index + # 5: release savepoint + with self.assertNumQueries(5, using='other'): management.call_command('createcachetable', database='other', verbosity=0, interactive=False)