我阅读了django文档中有关事务管理的章节。据我所知,只要调用TransactionMiddleware
就启动事务然后通过使用@commit_on_success
,@commit_manually
有可能控制交易结束。
我的问题是:有没有可能在不完全去掉TransactionMiddleware的情况下控制事务的开始我担心的是Django框架的许多部分实际上依赖于TransactionMiddleware的存在,所以我不想破坏它我希望它用于所有视图,但属于我显式指定的应用程序的视图除外最重要的是,我希望能够完全控制某些视图组的事务行为—从开始到结束我应该采取什么方法有什么外部应用程序和库可以帮助我吗事务是急切地创建还是懒洋洋地创建-只要第一次数据库命中?
最佳答案
事务是使用第一个数据库查询创建的。TransactionMiddleware
将类似于commit_on_success
的内容应用于所有视图。不需要显式地添加这个。commit_on_success
对于将此行为赋予从视图中调用的特定函数仍然很有用。
支持嵌套事务。
那么,为什么需要控制事务启动?如果只想回滚部分更改,则应使用嵌套事务完成此操作。
下面是我的代码中常见的用例:
@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, ...):
...