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

标签 django transactions commit rollback

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

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

这个想法很简单:

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

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

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

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

数据库支持:

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

这引发了一个附带的问题,即 Django 是否提供了这样的功能。我怀疑不是唉。我怀疑持久性 worker 是 uWsgi 和/或 Celery 的领域。我怀疑持有等待确认请求的数据库连接的持久守护进程称为事务管理器。

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

最佳答案

我不知道有哪个图书馆会直接按照您所说的去做。尽管我将如何解决这个问题是在提交表单之后,我会将变量存储在请求 session 中并执行必要的数据库验证检查,用户可以确认并执行交易。 在 Django 中,您可以使用事务库执行原子事务

from django.db import transaction

它允许您使用 @transaction.atomic 装饰器或 View 中的上下文函数

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/

关于Django:是否可以打开一个事务,要求用户确认,然后在确认或回滚时提交事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59787398/

相关文章:

python - 递归未知深度的查询集列表

sql - 如果以相同的顺序访问对象,如何会发生死锁?

svn - 在 Unix 机器上具有相同登录凭据的多个 SVN 用户

django - 当模板调试设置为 False 时,Django 上的服务器错误(500)?

django - 如何在TemplateTag中获取request.user

java - 我可以将 Guice 中的 @Transactional 与 Google App Engine 的数据存储一起使用吗?

svn - 在 Tortoise SVN 中向用户预提交显示一条消息

svn - 如何强制 subversion 提交未更改的文件?

python - 对于从父类继承的模型,Django 不发送 save() 信号?

mysql - 如何一次处理多个插入