【问题标题】:How interdependent db calls handled in transaction.atomic在 transaction.atomic 中如何处理相互依赖的数据库调用
【发布时间】:2022-01-23 11:33:24
【问题描述】:

我在transaction.atomic() 中有两个数据库调用

示例代码

with transaction.atomic():
    result1, created = SomeModel.objects.get_or_create(**somedata)
    if not created:
        flag = SomeOtherModel.objects.filter(somemodel=result1).exists()
        if flag:
            result1.some_attr = value1 if flag else value2
            result1.save()

关于transaction.atomic 的AFAIK 当我的python 代码不会导致异常时,因此所有数据库调用都将在数据库上提交。如果在块内引发任何异常,则不会向数据库提交任何数据库操作。

那么当在python逻辑中使用one的DB调用来进行其他DB操作时,这件事是如何处理的呢? 在文档中没有找到具体的,如果有好的来源,请提及。

【问题讨论】:

    标签: mysql django transactions relational-database


    【解决方案1】:

    数据库事务是一个复杂的话题,我没有链接文档的确切答案,但根据经验,我可以说您最好在同一事务中使用在事务中创建的变异值或新值。对事务的简单解释是,它确保一系列命令要么成功要么完全失败,因此您的数据库不会处于部分未完成状态,在事务之间,至少从 ORM 角度来看,您对数据库的体验应该保持不变一样的。

    这是我发现的一篇很好的 StackOverflow 帖子,其中包含一些很好的对话:Database transactions - How do they work?

    【讨论】:

      猜你喜欢
      • 2015-12-13
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 2018-10-19
      • 1970-01-01
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多