djangotransactionsdjango-1.6

Is "transaction.atomic" same as "transaction.commit_on_success"?


Django 1.6 proposes @transaction.atomic as part of the rehaul in the transaction management from 1.5.

I have a function which is called by a Django management command which is in turn called by cron, i.e. no HTTP request triggering transactions in this case. Snippet:

from django.db import transaction

@transaction.commit_on_success
def my_function():
    # code here

In the above code block commit_on_success uses a single transaction for all the work done in my_function.

Does replacing @transaction.commit_on_success with @transaction.atomic result in the identical behaviour? @transaction.atomic docs state:

Atomicity is the defining property of database transactions. atomic allows us to create a block of code within which the atomicity on the database is guaranteed. If the block of code is successfully completed, the changes are committed to the database. If there is an exception, the changes are rolled back.

I take it that they result in the same behaviour; correct?


Solution

  • Yes. You should use atomic in the places where you previously used commit_on_success.

    Since the new transaction system is designed to be more robust and consistent, though, it's possible that you could see different behavior. For example, if you catch database errors and try to continue on you will see a TransactionManagementError, whereas the previous behavior was undefined and probably case-dependent.

    But, if you're doing things properly, everything should continue to work the same way.