交易从Django开始

时间:2011-04-16 13:31:08

标签: python django transactions django-orm django-middleware

我阅读了Django文档中有关事务管理的章节。根据我的理解,只要调用TransactionMiddleware,就会启动事务。然后,通过使用@commit_on_success@commit_manually,可以控制交易结束。

我的问题:是否有可能在没有完全摆脱TransactionMiddleware的情况下控制交易开始。我担心的是Django框架的很多部分实际上都依赖于TransactionMiddleware存在,所以我真的不想打破它。我希望它用于所有视图,除了那些属于我明确指定的应用程序的视图。最重要的是,我希望能够完全控制某些视图组的事务行为 - 从开始到结束。我应该采取什么方法?有没有外部应用程序,库可以帮助我?是否急切地或懒惰地创建交易 - 一旦第一次数据库命中发生?

1 个答案:

答案 0 :(得分:4)

  1. 使用第一个数据库查询创建交易。

  2. TransactionMiddleware会将与commit_on_success类似的内容应用于您的所有观看内容。没有必要明确添加它。 commit_on_success对于将此行为提供给您在视图中调用的特定函数仍然有用。

  3. 支持嵌套事务。

  4. 那么,为什么需要控制交易开始?如果您只想回滚部分更改,则应使用嵌套事务完成此操作。

    以下是我的代码中的常见用例:

    @transaction.commit_manually
    def purchase(request, ...):
        try:
          ... # change some data
          _purchase(request, *args, **kwargs) # process purchase optimistically
        except PurchaseError, ex: # My own exception class for errors we know about
          _log_purchase(request, ex) # Save error in DB
          messages.error(ex.human_message())
          transaction.commit() # Save log entries
        except:
          transaction.rollback()
          raise
        else:
          transaction.commit()
    
    @transaction.commit_on_success
    def _purchase(request, ...):
        ...