事务
开始事务
// GenTx 在一个事务中创建多个群组的实体及其用户
func GenTx(ctx context.Context, client *ent.Client) error {
tx, err := client.Tx(ctx)
if err != nil {
return fmt.Errorf("starting a transaction: %v", err)
}
hub, err := tx.Group.
Create().
SetName("Github").
Save(ctx)
if err != nil {
return rollback(tx, fmt.Errorf("failed creating the group: %v", err))
}
// 为群组添加一个用户
dan, err := tx.User.
Create().
SetAge(29).
SetName("Dan").
AddManage(hub).
Save(ctx)
if err != nil {
return rollback(tx, err)
}
// 创建一个用户 "Ariel".
a8m, err := tx.User.
Create().
SetAge(30).
SetName("Ariel").
AddGroups(hub).
AddFriends(dan).
Save(ctx)
if err != nil {
return rollback(tx, err)
}
fmt.Println(a8m)
// Output:
// User(id=2, age=30, name=Ariel)
// 提交事务
return tx.Commit()
}
// rollback 会调用 tx.Rollback,如果此时发生错误,rollback 会将该错误也包装进去。
func rollback(tx *ent.Tx, err error) error {
if rerr := tx.Rollback(); rerr != nil {
err = fmt.Errorf("%v: %v", err, rerr)
}
return err
}完整的例子请查看 GitHub.
事务客户端
Transactional Client,事务客户端。 有时候,你的现有代码已经使用了 *ent.Client,但是你想将他修改(或包装)为使用事务客户端实现。 对于这种情况:你可以从现有的事务客户端获取一个 *ent.Client:
完整的例子请查看 GitHub.
最佳实践
在事务中运行回调函数:
用法:
Last updated
Was this helpful?
