2011-04-16 94 views
3

我阅读了关于交易管理的Django文档中的章节。据我所知,只要调用TransactionMiddleware就开始交易。然后通过使用@commit_on_success,@commit_manually有可能控制交易结束。在Django开始的交易

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

回答

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

我必须这样做,因为我想与明确设置的隔离级别开始交易。如果出现特定的异常,则沿着'IsolationLevelRequired'行,我希望能够以更高的隔离级别重新启动事务,比如说'SERIALIZABLE'。虽然这看起来比我预期的要好,但今天会看看。谢谢。 – julkiewicz 2011-04-16 15:53:22

+1

此外 - django/db/transaction.py有一个非常好的代码文档。这似乎与你所说的一致。 – julkiewicz 2011-04-16 22:30:25