add fluent transactions translation (#672)

* add fluent transactions translation

* modify some translations
This commit is contained in:
JIN 2022-06-28 19:20:30 +08:00 committed by GitHub
parent f7fa29d260
commit 54ad846467
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 43 additions and 0 deletions

View File

@ -0,0 +1,43 @@
# 事务
事务允许你在将数据保存到数据库之前确保多个操作成功完成。事务启动后,你可以正常运行 Fluent 查询。但是,在事务完成之前,不会将任何数据保存到数据库中。如果在事务执行期间的任何时候(由你或数据库)抛出错误,则任何更改都不会生效。
为了执行事务,你需要通过某种方式连接到数据库。这通常是一个传入的 HTTP 请求。为此,请使用 `req.db.transaction(_ :)`
```swift
req.db.transaction { database in
// use database
}
```
进入事务闭包后,必须使用闭包参数中提供的数据库(在本例中名为 `database`)执行查询。
一旦这个闭包成功返回,事务将被提交。
```swift
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 状态表明已完成,如下所示:
```swift
return req.db.transaction { database in
// use database and perform transaction
}.transform(to: HTTPStatus.ok)
```
## `async`/`await`
如果使用 `async`/`await` 你可以将代码重构为以下内容:
```swift
try await req.db.transaction { transaction in
try await sun.save(on: transaction)
try await sirius.save(on: transaction)
}
return .ok
```