【发布时间】:2018-02-08 20:04:47
【问题描述】:
我有一个这样的 Python Django REST API 视图:
from rest_framework.decorators import api_view, permission_classes
from django.db import transaction
@api_view( [ 'POST' ] )
@permission_classes( ( IsAuthenticated, ) )
@transaction.non_atomic_requests
def myview( request ):
with transaction.atomic():
db_do_something1()
with transaction.atomic():
do_do_something2()
return some_response
在这种情况下,SQL 实际上针对我的 PostgreSQL 数据库运行,在 db_do_something1 和 2 之前和之后创建了保存点 - 但关键是在离开 with 块后不提交。
整个视图仍然包裹在BEING 中,COMMIT 仅在视图结束时发送到数据库。
如果我将 @transaction.non_atomic_requests 装饰器移动到装饰器列表的开头,那么我会得到正确的行为,每个 with 块都在自己的事务中并在最后提交。
这是怎么回事?
【问题讨论】:
标签: django python-2.7 postgresql django-rest-framework django-orm