Made select_for_update() don't raise TransactionManagementError on databases that don't support transactions.

This commit is contained in:
Mariusz Felisiak 2022-04-14 07:53:15 +02:00 committed by GitHub
parent db83ac48d4
commit a0bd006306
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 12 additions and 15 deletions

View File

@ -653,7 +653,12 @@ class SQLCompiler:
params.extend(f_params)
if self.query.select_for_update and features.has_select_for_update:
if self.connection.get_autocommit():
if (
self.connection.get_autocommit()
# Don't raise an exception when database doesn't
# support transactions, as it's a noop.
and features.supports_transactions
):
raise TransactionManagementError(
"select_for_update cannot be used outside of a transaction."
)

View File

@ -32,19 +32,11 @@ class ExplainTests(TestCase):
for idx, queryset in enumerate(querysets):
for format in all_formats:
with self.subTest(format=format, queryset=idx):
with CaptureQueriesContext(connection) as captured_queries:
if queryset.query.select_for_update:
with transaction.atomic():
result = queryset.explain(format=format)
else:
result = queryset.explain(format=format)
self.assertEqual(len(captured_queries), 1)
with self.assertNumQueries(1) as captured_queries:
result = queryset.explain(format=format)
self.assertTrue(
any(
captured_query["sql"].startswith(
connection.ops.explain_prefix
)
for captured_query in captured_queries
captured_queries[0]["sql"].startswith(
connection.ops.explain_prefix
)
)
self.assertIsInstance(result, str)

View File

@ -491,7 +491,7 @@ class SelectForUpdateTests(TransactionTestCase):
str(Person.objects.filter(name="foo").select_for_update().query),
)
@skipUnlessDBFeature("has_select_for_update")
@skipUnlessDBFeature("has_select_for_update", "supports_transactions")
def test_for_update_requires_transaction(self):
"""
A TransactionManagementError is raised
@ -501,7 +501,7 @@ class SelectForUpdateTests(TransactionTestCase):
with self.assertRaisesMessage(transaction.TransactionManagementError, msg):
list(Person.objects.select_for_update())
@skipUnlessDBFeature("has_select_for_update")
@skipUnlessDBFeature("has_select_for_update", "supports_transactions")
def test_for_update_requires_transaction_only_in_execution(self):
"""
No TransactionManagementError is raised