回滚Django中每个请求的db事务

时间:2016-04-18 22:03:28

标签: python django database transactions

我正在考虑将基于Django的站点从v1.4升级到框架的v1.9。该站点在我们的基础架构中发挥关键作用,并且可以看到相当大我们的测试套件非常好,但远不及100%覆盖率。因此,我希望以安全和保守的方式进行升级。

我的灵感来自于Github最近的rewriting major features方法,它将新代码和旧代码作为实验和控制运行,返回旧代码的结果并记录任何差异或错误。新代码。

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

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

所以,我的问题:如何将每个请求回滚到Django 1.9站点的每个请求?

更新

通过更多的研究,似乎我可以通过为数据库启用ATOMIC_REQUESTS(最好的设置名称!)并使用带有process_response()方法的自定义中间件来回滚交易。我欢迎改进或替代。

2 个答案:

答案 0 :(得分:2)

您应该使用注释@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

答案 1 :(得分:1)

如果您想使用@transaction.atomic并仍然管理例外,可以将其与with声明一起使用:

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