跳转至

事务

事务允许你在将数据保存到数据库之前确保多个操作成功完成。事务启动后,你可以正常运行 Fluent 查询。但是,在事务完成之前,不会将任何数据保存到数据库中。如果在事务执行期间的任何时候(由你或数据库)抛出错误,则任何更改都不会生效。

为了执行事务,你需要通过某种方式连接到数据库。这通常是一个传入的 HTTP 请求。为此,请使用 req.db.transaction(_ :)

req.db.transaction { database in
    // use database
}

进入事务闭包后,必须使用闭包参数中提供的数据库(在本例中名为 database)执行查询。

一旦这个闭包成功返回,事务将被提交。

var sun: Star = ...
var sirius: Star = ...

return req.db.transaction { database in
    return sun.save(on: database).flatMap { _ in
        return sirius.save(on: database)
    }
}

上面的例子将在完成事务之前保存 sun 然后保存 sirius。如果任何一项保存失败,则两者都不会被保存。

一旦事务完成,可以通过 transform(to:...) 方法将结果转换为不同的类型,例如转换为 HTTP 状态表明已完成,如下所示:

return req.db.transaction { database in
    // use database and perform transaction
}.transform(to: HTTPStatus.ok)

async/await

如果使用 async/await 你可以将代码重构为以下内容:

try await req.db.transaction { transaction in
    try await sun.save(on: transaction)
    try await sirius.save(on: transaction)
}
return .ok