python-从Django开始的交易
作者:互联网
我阅读了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, ...):
...
标签:django-middleware,django-orm,transactions,python,django 来源: https://codeday.me/bug/20191102/1993598.html