transaction semaphore: release in a finally block

transaction.commit can fail (in fact: e.g. FK checks _only_ happen on-commit)
such failures _must_  release the semaphore, otherwise the next request
will be stuck forever.
This commit is contained in:
Klaas van Schelven
2025-02-06 14:18:46 +01:00
parent 95e8aba23e
commit 415da94093

View File

@@ -151,17 +151,19 @@ class ImmediateAtomic(SuperDurableAtomic):
self.t0 = time.time()
def __exit__(self, exc_type, exc_value, traceback):
super(ImmediateAtomic, self).__exit__(exc_type, exc_value, traceback)
try:
super(ImmediateAtomic, self).__exit__(exc_type, exc_value, traceback)
took = (time.time() - self.t0) * 1000
performance_logger.info(f"{took:6.2f}ms IMMEDIATE transaction")
took = (time.time() - self.t0) * 1000
performance_logger.info(f"{took:6.2f}ms IMMEDIATE transaction")
connection = django_db_transaction.get_connection(self.using)
if hasattr(connection, "_start_transaction_under_autocommit"):
connection._start_transaction_under_autocommit = connection._start_transaction_under_autocommit_original
del connection._start_transaction_under_autocommit_original
connection = django_db_transaction.get_connection(self.using)
if hasattr(connection, "_start_transaction_under_autocommit"):
connection._start_transaction_under_autocommit = connection._start_transaction_under_autocommit_original
del connection._start_transaction_under_autocommit_original
immediate_semaphore.release()
finally:
immediate_semaphore.release()
def immediate_atomic(using=None, savepoint=True, durable=True):