在Djang中为每个请求回滚db事务

2024-09-29 02:17:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在考虑将基于Django的站点从框架的v1.4升级到v1.9。该站点在我们的基础设施中扮演着重要的角色,并且可以看到可观的流量。我们的测试套件很好,但还没有达到100%的覆盖率。正因为如此,我希望以安全和保守的方式进行升级。在

我受到了Github最近对rewriting major features的方法的启发,它将新代码和旧代码作为实验和控件运行,返回旧代码的结果并记录新代码中的任何差异或错误。在

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

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

所以,我的问题是:如何将每个请求的每个事务回滚到django1.9站点?

更新:

经过进一步的研究,我似乎可以通过启用^{}(有史以来最好的设置名)来获得这个行为对于数据库,并使用带有回滚事务的^{}方法的自定义中间件。我欢迎改进或替代品。在


Tags: 中间件django方法代码框架数据库角色套件
2条回答

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

try:
    with transaction.atomic():
        a.save()
except IntegrityError, e:
    return ....  # Manage the 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

相关问题 更多 >