当前位置: 首页 > 面试题库 >

Django 1.6中的ATOMIC_REQUEST和事务

章涵容
2023-03-14
问题内容

给出以下代码:

from django.db import transaction

@transaction.atomic
def viewfunc(request):
    # This code executes inside a transaction.
    do_stuff()

根据我对Django
1.6中事务的理解,如果do_stuff抛出异常(例如IntegrityError),那么事务将被正确回滚。但是由于Django本身正在调用视图,所以没有什么可以阻止IntegrityError上升调用堆栈并导致HTTP
500错误的吗?让我们假设这不是我们想要的,因为我们想要优雅地处理错误,但仍然可以获得回滚功能。

因此,我想显而易见的想法是好的,不要那样做,将其transaction.atomic用作上下文管理器,该上下文管理器包含在try
try块中,例如此处的示例:

try:
    with transaction.atomic():
        generate_relationships()
except IntegrityError:
    handle_exception()

精细。但是,如果您想通过在数据库配置中设置ATOMIC_REQUEST =
True来使用“每个HTTP请求的事务”功能,这意味着django实际上只会将transaction.atomic装饰添加到视图中,而不会捕获任何异常。ATOMIC_REQUEST甚至有什么用?为什么要让您的数据库错误一直传播到用户?

所以我的问题是。

  1. 我在这里缺少什么,或者我的理解正确吗?
  2. 如果我是正确的,那么使用ATOMIC_REQUEST的用例是什么?我应该编写一个urls.hadler500还是应该实现一些中间件来捕获错误?

问题答案:

您的理解是正确的。您所缺少的是,让异常从您的视图代码传播(这与“一直传播到用户”大不相同)在Django中是完全正常的事情。

您可以通过创建500.html模板,覆盖handler500或制作自己的自定义中间件来自定义结果行为。在所有这些标准情况下,使用ATOMIC_REQUESTS都会做您想要做的事情。

如果您想在视图代码中捕获异常并进行特​​殊处理,则可以做到这一点,您只需要指定如何手动处理事务即可。使用ATOMIC_REQUESTS只是为常见情况节省一些样板的一种方法,同时允许您在罕见情况下自己定制行为。



 类似资料:
  • 我有一个使用Hibernate/JPA的持久性Spring Boot应用程序。 我正在使用事务来管理我的数据库持久性,并且我正在使用注释来定义应该以事务方式执行的方法。 在持久化时,我有三个主要的事务粒度级别: 要保留的实体批次 要保留的单个实体 保留实体的单一数据库操作 因此,在考虑整个持久性流量时,您可以想象我有三个级别的嵌套事务。 第2层和第3层之间的交互如我所愿透明地工作,因为在没有为事务

  • 如果另一个客户机在我们调用watch之后更改了powerlevel的值,我们的事务将失败。如果没有客户端更改该值,则该集合将工作。我们可以在循环中执行这段代码,直到它起作用为止。 为什么不能在不能被其他命令打断的事务中执行增量?为什么我们需要迭代而不是等到没有人改变值才开始事务?

  • 我过去认为,在分层应用程序(控制器或服务)中,将验证逻辑放在何处并不重要,但最近正在开发需要事务的服务(使用spring)。Spring使用方面创建代理,Spring代码如下所示: org.springframework.transaction.interceptor.事务支持 所以从我这里看到的,spring首先打开事务,然后执行代码。考虑到验证可能会失败,并且根本不需要DB调用,这是否意味着将

  • 在我的示例中,我有一个Hibernate实体和一个DAO。 当我以这种方式使用DAO时 数据库中只保存了一行(Action2)。当我删除注释时,两行(Action1和Action2)都被保存(这是我需要的行为)。我的问题是服务层上的事务注释如何影响事务(方法executeTransaction())的执行。为什么没有服务层上的事务性注释,这两行都保存在数据库中,而只有最后一行与此注释一起保存?

  • 在PyGTK教程的这章中,我们将讨论信号和事件。 所有的GUI应用程序都是事件驱动,PyGTK应用程序也不列外。程序调用gtk.main()函数开始一个主循环。该循环不断地检查新产生的事件。如果没有事件,程序将等待,什么都不做。 Events(事件)是从X服务到程序之间的消息。当我们点击一个按钮部件,这个点击(clicked)信号将会被发出(be emitted)。有些信号是所有的部件都继承,例如

  • 本文向大家介绍浅谈javascript中的事件冒泡和事件捕获,包括了浅谈javascript中的事件冒泡和事件捕获的使用技巧和注意事项,需要的朋友参考一下 1.事件冒泡   IE 的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档)。以下面的HTML 页面为例: 如果你单击了页面中的<div