diff --git a/django/core/cache/backends/db.py b/django/core/cache/backends/db.py index 5c9ea3e7bb..bb91d8cb05 100644 --- a/django/core/cache/backends/db.py +++ b/django/core/cache/backends/db.py @@ -184,6 +184,7 @@ class DatabaseCache(BaseDatabaseCache): table = connections[db].ops.quote_name(self._table) cursor = connections[db].cursor() cursor.execute('DELETE FROM %s' % table) + transaction.commit_unless_managed(using=db) # For backwards compatibility class CacheClass(DatabaseCache): diff --git a/tests/regressiontests/cache/tests.py b/tests/regressiontests/cache/tests.py index 42d093963e..b446465d32 100644 --- a/tests/regressiontests/cache/tests.py +++ b/tests/regressiontests/cache/tests.py @@ -18,7 +18,7 @@ from django.core import management from django.core.cache import get_cache from django.core.cache.backends.base import (CacheKeyWarning, InvalidCacheBackendError) -from django.db import router +from django.db import router, transaction from django.http import (HttpResponse, HttpRequest, StreamingHttpResponse, QueryDict) from django.middleware.cache import (FetchFromCacheMiddleware, @@ -836,6 +836,13 @@ class DBCacheTests(BaseCacheTests, TransactionTestCase): interactive=False ) + def test_clear_commits_transaction(self): + # Ensure the database transaction is committed (#19896) + self.cache.set("key1", "spam") + self.cache.clear() + transaction.rollback() + self.assertEqual(self.cache.get("key1"), None) + @override_settings(USE_TZ=True) class DBCacheWithTimeZoneTests(DBCacheTests):