Django从原子块内的数据库刷新数据

Leo*_*rdo 5 django atomic django-models django-database

我有一个复杂的代码块来处理 ORM 对象关系的创建/更新。

假设模型是 A 和 B,关联是 OneToOne A - BA.b_line指向 B)。

1)在创建/更新关联之前,需要更新一些A对象并将其保存到数据库中。在此操作期间,将计算并保存 A 对象的一些内部字段。

2)更新的A对象从db重新加载(因为我们需要派生的计算字段)并且可以继续与B对象的关联。

例子:

def update_and_associate(a_items):
    with transaction.atomic():
        for item in a_items:
            item.field_alpha = 1
            # updates item.field_beta depending on 
            # item.field_alpha 
            item.update_beta()
            item.save()  # Save to db

        with transaction.atomic:
            for item in a_items:
                item.refresh_from_db()
                b = item.b_line
                b.total = a.field_beta
                b.save()

# later...
try:
    update_and_associate(items)
except Exception as e:
    handle_exception(e)
Run Code Online (Sandbox Code Playgroud)

我将代码封装在嵌套原子事务块中,以便如果发生任何异常,则应回滚更改(带有 InnoDB 的 MySql)。

问题是,在第二个原子块中,当我重新加载项目时,refresh_from_db它们不同步,这意味着它们具有旧值,就好像第一个事务块根本没有运行一样。

我认为任何更改都会尽快提交,但如果出现异常,我们仍然有可能回滚。

所以我的问题是:通过将代码括起来transaction.atomic意味着要对数据库执行的所有写入修改都会推迟到我们退出该块为止?这可以解释为什么数据库中刷新的项目具有旧值。