Django:是否可以打开交易,请用户确认,然后在确认交易后提交交易或回滚

问题描述 投票:2回答:1

我已阅读文档:https://docs.djangoproject.com/en/3.0/topics/db/transactions/

但是我不清楚事务是否可以跨越HTTP请求。

这个想法很简单:

  1. 用户提交表单
  2. 然后后端
    1. 打开交易
    2. 保存数据
    3. 向用户提供确认表格
    4. 用户然后确认或取消
  3. 后端然后在确认时提交或在取消时回滚

主要问题是,在HTTP请求上打开了事务,然后等待用户响应(如果我想如果没有收到,我们会回滚),而在第二个HTTP请求上,事务已提交。

我在文档中看不到涵盖此类用例的任何内容,也没有在线找到任何内容。但是,这将使我成为一个相当普通的用例。之所以出现这种情况,主要是因为提交的内容很复杂,涉及许多模型和关系,而检查提交的内容影响的最简单(几乎只有明智或可行的)方法是保存所有这些内容然后研究其影响。发生这种情况的过程非常出色,但是到目前为止,在处理表单时,我一直被迫在一个请求中做出提交或回退决定。我现在想在用户提交之前将分析结果反馈给用户并要求确定!

令我震惊的是,第二个请求需要知道确认涉及的交易,并确定该交易是否已打开,然后提交或回滚。这增加了我在Django文档中看不到的整个交易标识层。

数据库支持:

有趣的Postgresql可以支持此操作,只要整个事务属于一个会话(数据库连接),就象我怀疑其他数据库那样。因此,这意味着只有在持久化守护程序执行保存操作之后,该守护程序才能启动事务并保持运行状态,直到确认并提交或回滚事务为止。

这提出了一个附属问题,即Django是否提供了这样的工具。我怀疑不是las。我怀疑持久性工作者是uWsgi和/或Celery的领域。我怀疑将数据库连接保持在等待确认请求的持久守护程序,我怀疑它是事务管理器。

所以这个问题确实变成了简短的语言:是否有一种简单/规范的方式为Django实现事务管理器。

django transactions commit rollback
1个回答
0
投票

我不知道有哪个图书馆会直接喜欢您所说的。尽管在表单提交后我将如何处理此问题,但我会将变量存储在请求会话中并执行必要的DB验证检查,然后用户可以确认并可以执行事务。在Django中,您可以使用交易库执行原子交易]

from django.db import transaction

哪个允许您使用@transaction.atomic装饰器或视图中的上下文函数

def viewfunc(request):
    # This code executes in autocommit mode (Django's default).
    do_stuff()

    with transaction.atomic():
        # This code executes inside a transaction.
        do_more_stuff() 

您可以在Django文档中阅读有关它的更多信息https://docs.djangoproject.com/en/3.0/topics/db/transactions/

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.