事务失败后回滚

Rolling back after a failed transaction

我有一个操作需要使用一定数量的子模型来创建父模型。如果这些实例中的任何一个创建失败,则需要取消整个过程。如果出现错误,父模型及其子模型应该存在于数据库中。

我的代码:

transaction = db.engine.connect().begin()

try:
    parent = ParentModel()
    db.session.add(parent)
    db.session.commit()

    child = ChildModel(parent_id=parent.id)
    db.session.add(child)
    db.session.commit()

    # An error occurs.  We need to rollback the saved parent model.
    raise HTTPException() # from werkzeug
except:
    transaction.rollback()

transaction.commit()

我的测试:

def test(self):
    # call the above operation
    ParentModel.query.filter_by(id=1).first() # returns the parent model

Flask-SQLAlchemy 默认开启自动提交。为了回滚事务,您需要将其关闭。而不是

db = SQLAlchemy(app)  # or whatever variation you use

使用

db = SQLAlchemy(app, session_options={'autocommit': False})

这将允许您在提交或回滚之前向 db.session 添加多个对象。

通过此更改,您可以删除对 transaction 的引用。