【问题标题】:Transaction beginning in Django以 Django 开始的事务
【发布时间】:2011-08-06 21:45:54
【问题描述】:

我阅读了 Django 文档中有关事务管理的章节。据我了解,一旦调用TransactionMiddleware,事务就会启动。然后使用@commit_on_success,@commit_manually就有可能控制事务结束。

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

【问题讨论】:

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


    【解决方案1】:
    1. 事务是使用第一个数据库查询创建的。

    2. TransactionMiddleware 将类似于commit_on_success 的内容应用于您的所有视图。无需明确添加。 commit_on_success 仍可用于将此行为赋予您从视图中调用的特定函数。

    3. 支持嵌套事务。

    那么,为什么需要控制事务启动呢?如果您只想回滚部分更改,则应使用嵌套事务来完成。

    这是我的代码中的常见用例:

    @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, ...):
        ...  
    

    【讨论】:

    • 我需要这样做,因为我想以明确设置的隔离级别开始事务。如果出现特定异常,类似于IsolationLevelRequired 我希望能够以更高的隔离级别重新启动事务,例如SERIALIZABLE。虽然这看起来比我预期的要好,但今天会研究一下。谢谢。
    • 另外 - django/db/transaction.py 有一个非常好的代码内文档。好像和你说的一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2018-06-15
    • 2016-09-28
    • 1970-01-01
    相关资源
    最近更新 更多