Commit a5c8072a authored by Barthelemy Dagenais's avatar Barthelemy Dagenais Committed by Tim Graham
Browse files

Fixed #26627 -- Fixed on_commit callbacks execution order when callbacks make transactions.

parent 4ff1e6ef
Loading
Loading
Loading
Loading
+5 −6
Original line number Diff line number Diff line
@@ -617,12 +617,11 @@ class BaseDatabaseWrapper(object):

    def run_and_clear_commit_hooks(self):
        self.validate_no_atomic_block()
        try:
            while self.run_on_commit:
                sids, func = self.run_on_commit.pop(0)
                func()
        finally:
        current_run_on_commit = self.run_on_commit
        self.run_on_commit = []
        while current_run_on_commit:
            sids, func = current_run_on_commit.pop(0)
            func()

    def copy(self, alias=None, allow_thread_sharing=None):
        """
+3 −0
Original line number Diff line number Diff line
@@ -17,3 +17,6 @@ Bugfixes

* Fixed a regression causing the cached template loader to crash when using
  lazy template names (:ticket:`26603`).

* Fixed ``on_commit`` callbacks execution order when callbacks make
  transactions (:ticket:`26627`).
+14 −0
Original line number Diff line number Diff line
@@ -208,6 +208,20 @@ class TestConnectionOnCommit(TransactionTestCase):

        self.assertDone([1])

    def test_hook_in_hook(self):
        def on_commit(i, add_hook):
            with transaction.atomic():
                if add_hook:
                    transaction.on_commit(lambda: on_commit(i + 10, False))
                t = Thing.objects.create(num=i)
                self.notify(t.num)

        with transaction.atomic():
            transaction.on_commit(lambda: on_commit(1, True))
            transaction.on_commit(lambda: on_commit(2, True))

        self.assertDone([1, 11, 2, 12])

    def test_raises_exception_non_autocommit_mode(self):
        def should_never_be_called():
            raise AssertionError('this function should never be called')