Commit 01e2be55 authored by Alex Gaynor's avatar Alex Gaynor
Browse files

Fixed #14550 -- fixed the behavior of commit_on_success to exit the...

Fixed #14550 -- fixed the behavior of commit_on_success to exit the transaction properly.  This was a bug introduced in [14288].  Thanks to Justin for the report and Florian Apolloner for help debugging.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@14343 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent eccc42a8
Loading
Loading
Loading
Loading
+12 −9
Original line number Diff line number Diff line
@@ -345,6 +345,7 @@ def commit_on_success(using=None):
        managed(True, using=using)

    def exiting(exc_value, using):
        try:
            if exc_value is not None:
                if is_dirty(using=using):
                    rollback(using=using)
@@ -355,6 +356,8 @@ def commit_on_success(using=None):
                    except:
                        rollback(using=using)
                        raise
        finally:
            leave_transaction_management(using=using)

    return _transaction_func(entering, exiting, using)

+20 −0
Original line number Diff line number Diff line
@@ -113,6 +113,25 @@ class TransactionTests(TransactionTestCase):
        remove_comitted_on_success("Alice")
        self.assertEqual(list(Reporter.objects.all()), [])

    @skipUnlessDBFeature('supports_transactions')
    def test_commit_on_success_exit(self):
        @transaction.autocommit()
        def gen_reporter():
            @transaction.commit_on_success
            def create_reporter():
                Reporter.objects.create(first_name="Bobby", last_name="Tables")

            create_reporter()
            # Much more formal
            r = Reporter.objects.get()
            r.first_name = "Robert"
            r.save()

        gen_reporter()
        r = Reporter.objects.get()
        self.assertEqual(r.first_name, "Robert")


    @skipUnlessDBFeature('supports_transactions')
    def test_manually_managed(self):
        """
@@ -146,6 +165,7 @@ class TransactionTests(TransactionTestCase):
            using_manually_managed_mistake
        )


class TransactionRollbackTests(TransactionTestCase):
    def execute_bad_sql(self):
        cursor = connection.cursor()
+14 −0
Original line number Diff line number Diff line
@@ -78,6 +78,20 @@ class TransactionContextManagerTests(TransactionTestCase):

        self.assertQuerysetEqual(Reporter.objects.all(), [])

    @skipUnlessDBFeature('supports_transactions')
    def test_commit_on_success_exit(self):
        with transaction.autocommit():
            with transaction.commit_on_success():
                Reporter.objects.create(first_name="Bobby", last_name="Tables")

            # Much more formal
            r = Reporter.objects.get()
            r.first_name = "Robert"
            r.save()

        r = Reporter.objects.get()
        self.assertEqual(r.first_name, "Robert")

    @skipUnlessDBFeature('supports_transactions')
    def test_manually_managed(self):
        """