Django:是否可以打开一个事务,要求用户确认,然后在确认或回滚时提交事务



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

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

这个想法很简单:

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

主要问题是事务是在HTTP请求上打开的,然后等待用户响应(如果从未收到,我想我们会在超时时回滚(,当它出现在第二个HTTP请求时,事务被提交。

我在文档中没有看到任何涵盖此类用例的内容,并且在网上也没有找到任何内容。然而,在我看来,这是一个相当普通的用例。它之所以出现,主要是因为提交很复杂,涉及许多模型和关系,而检查提交影响的最简单(几乎只是明智或站得住脚的(方法是保存所有这些,然后研究影响。这在发生时非常有效,但到目前为止,在处理表单时,我一直被迫在一个请求中做出提交或回滚决定。我现在想在提交之前将我的分析扔回给用户并要求确定!

这样做让我印象深刻,第二个请求需要知道确认与哪个事务相关,并确定该事务是否打开,然后提交或回滚。这增加了我在 Django 文档中看不到的整个事务标识层。

数据库支持:

有趣的Postgresql可以支持这一点,只要整个事务属于单个会话(数据库连接(,我怀疑其他数据库也是如此。因此,这意味着它只有在持久守护程序执行保存时才能工作,该守护程序可以启动事务并保持运行,直到事务被确认并提交或回滚。

这就提出了一个附带的问题,即Django是否提供了这样的设施。我怀疑不是唉。我怀疑坚持不懈的工人是uWsgi和/或Celery的领域。而保存待确认请求的数据库连接的持久守护进程,我怀疑称为事务管理器。

所以这个问题真的变成了更简洁的语言:有没有一种简单/规范的方式来实现 Django 的事务管理器。

我不知道有任何库会像你所说的那样直接做。尽管我将如何处理这个问题是在表单提交后,我将变量存储在请求会话中并执行必要的数据库验证检查,用户可以在此基础上确认并执行事务。 在 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/

最新更新