mirror of https://github.com/vapor/docs.git
add fluent transactions translation (#672)
* add fluent transactions translation * modify some translations
This commit is contained in:
parent
f7fa29d260
commit
54ad846467
|
|
@ -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
|
||||
```
|
||||
Loading…
Reference in New Issue