繁体   English   中英

为Django中的每个请求回滚数据库事务

[英]Rolling back the db transaction for every request in Django

我正在考虑将基于Django的站点从框架的v1.4升级到v1.9。 该站点在我们的基础架构中扮演着至关重要的角色,并且看到了大量的流量。 我们的测试套件相当不错,但覆盖率几乎没有达到100%。 因此,我想以安全和保守的方式执行升级。

Github最近通过将新代码和旧代码作为实验和控件运行,返回旧代码的结果并记录新代码中的任何差异或错误来重写主要功能的方法启发了我。

因为我正在升级框架版本本身(以及支持的库),所以我不能只使用Python的Scientist端口,例如labour 在我看来,最简单的方法是派生站点本身,将每个请求发送到两个站点,但仅提交并从控制站点返回结果。

为此,我需要实验站点针对与控制站点相同的数据库运行,但不提交任何内容。 在我看来,我应该能够通过编写某种中间件来做到这一点,该中间件可以在请求-响应周期结束时回滚当前事务,但是我不确定该如何进行。

所以,我的问题是: 如何将针对Django 1.9站点的每个请求的每个事务回滚?

更新:

经过更多研究,似乎可以通过为数据库启用ATOMIC_REQUESTS (有史以来最佳设置名称!)并将定制中间件与可回滚事务的process_response()方法结合使用来实现此功能。 我欢迎改进或替代方案。

你应该像这样使用注解@transaction.atomic()

交易回滚

第一种选择是回滚整个事务。 例如::

a.save() # Succeeds, but may be undone by transaction rollback
try:
    b.save() # Could throw exception
except IntegrityError:
    transaction.rollback()
c.save() # Succeeds, but a.save() may have been undone

调用transaction.rollback()将回滚整个事务。 任何未提交的数据库操作都将丢失。 在此示例中,即使该操作本身未引发错误, a.save()所做的更改也将丢失。

为了更好地理解,只需检查交易

如果要使用@transaction.atomic并仍管理异常,则可以将其与with语句一起with

try:
    with transaction.atomic():
        a.save()
except IntegrityError, e:
    return ....  # Manage the response

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM