第二个objects.create无法创建记录后Django回滚不起作用

Posted

技术标签:

【中文标题】第二个objects.create无法创建记录后Django回滚不起作用【英文标题】:Django rollback not working after second objects.create fails to create a record 【发布时间】:2018-10-25 09:04:28 【问题描述】:

这里是视图的sn-p代码:

@transaction.atomic()
def insert_in_sample_table(request):
    try:
        with transaction.atomic():
            insert_obj = SampleTable1.objects.create(fld_id=2, fld_name='abc')
            raise Exception ("This is manual exception")
            insert_obj2 = SampleTable2.objects.create(fld_id=1, fld_name='xyz')
        return HttpResponse("SUCCESS")
    except Exception as e:
        return HttpResponse(str(e))

有两种型号:

    SampleTable1 SampleTable2

我在第一次创建后手动引发了异常,现在我希望必须撤消在第一个模型(SampleTable1)中所做的更改。 但不幸的是我没有看到回滚

我在settings.py文件的DATABASE中添加了'ATOMIC_REQUESTS': True,

我删除了

 @transaction.atomic()

检查了一下,还是没有回滚。

如何使第一个数据库事务回滚?

【问题讨论】:

你用的是什么数据库? 使用的数据库是mysql 您必须更具体一些,因为 MySQL 数据库有 2 种类型,django docs 声明其中只有 1 种支持事务。您需要弄清楚您使用的是“InnoDB”(较新,有事务)还是“MyISAM”(较旧,不支持事务)。 我正在使用实际上支持回滚的 InnoDB 我已经编辑了我的问题。它的问题是我没有在 settings.py 文件的数据库中添加 'ATOMIC_REQUESTS': True。但是现在在两个事务之间添加手动回滚后,我看不到回滚 【参考方案1】:

您可以像这样使用“@transaction.atomic”装饰器:

@transaction.atomic
def insert_in_sample_table(request):
    tra = transaction.savepoint()

    try:
         insert_obj = SampleTable1.objects.create(fld_id=2, fld_name='abc')
         insert_obj2 = SampleTable2.objects.create(fld_id=1, fld_name='xyz')

         transaction.savepoint_commit(tra)
         return HttpResponse("SUCCESS")
    except IntegrityError:
         transaction.savepoint_rollback(tra)
         return HttpResponse("DB ERROR")

如果您使用多个数据库,则应指定连接名称并替换该行:

with transaction.atomic():

为此:

with transaction.atomic(using='connection_name'):

【讨论】:

嘿,我确实添加了保存点,但它仍然无法正常工作。第一个数据库事务没有回滚。 如果您添加另一个异常行以便捕获一般错误except Exception:transaction.savepoint_rollback(tra)return HttpResponse("GENERAL ERROR")

以上是关于第二个objects.create无法创建记录后Django回滚不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Swift JSON 无法获取第二个变量

django 中 User.objects.create_user() vs User.objects.create() vs User().save() 的区别

django ORM CRUD

Django重新开始学习 -数据库操作

rac 11g_第二个节点重启后无法启动实例:磁盘组dismount问题

即使在 C 中使用“\n%.2f”后,也无法将浮点值舍入到最接近的第二个小数 [关闭]