1. 事务
GORM 默认在事务中执行单个 create
, update
, delete
操作,以确保数据库数据完整性。
如果你想将多个 create
, update
, delete
当成一个原子性操作,Transaction
就是为了这个而创造的。
1.1. 事务
要在事务中执行一组操作,正常的流程如下所示。
// 开启事务
tx := db.Begin()
// 在事务中执行一些数据库操作 (从这里开始使用 'tx',而不是 'db')
tx.Create(...)
// ...
// 发生错误回滚事务
tx.Rollback()
// 或者提交这个事务
tx.Commit()
1.2. 具体例子
func CreateAnimals(db *gorm.DB) err {
// 注意在事务中要使用 tx 作为数据库句柄
tx := db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
if tx.Error != nil {
return err
}
if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
tx.Rollback()
return err
}
if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {
tx.Rollback()
return err
}
return tx.Commit().Error
}