3

我阅读了 Django 文档中关于事务管理的章节。据我了解,事务一TransactionMiddleware被调用就开始了。然后通过使用@commit_on_success@commit_manually就有可能控制事务结束。

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

4

1 回答 1

4
  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, ...):
    ...  
于 2011-04-16T13:34:37.273 回答