github.com/jinzhu/gorm 是Gorm v1的地址;
gorm.io/gorm 是Gorm v2的地址;
在Gorm v2在v1的基础上 进行了性能优化;事务支持save point, rollback saved point; 支持数据库的读写分离,可参考更新日志 | 高级主题 |《GORM 中文文档 v2》| Go 技术论坛
SetMaxOpenConns 客户端最大连接数;
SetMaxIdleConns 最大空闲可复用连接数,即可用连接池的大小,再多的空闲连接就会被杀死,保留空闲连接是为了复用连接,不然每次执行sql都会重新建立新的连接;
SetConnMaxLifetime 连接最长持续时间,从连接建立开始计算,默认时间为永久不过期;
SetConnMaxIdleTime 连接最长空闲时间,从连接空闲开始计算,默认时间为永久不过期,一般要小于SetConnMaxLifetime;
打开的连接 = 正在使用的连接(inuse) + 处于空闲状态的连接(idle),同时如果各个客户端未释放的连接数已经达到 MySQL 的上限,就会报错 "Can not connect to MySQL server. Too many connections"
创建方法才是那些会产生 SQL 查询并且发送到数据库,通常它就是一些 CRUD 方法, 比如:Create, First, Find, Take, Save, UpdateXXX, Delete, Scan, Row, Rows。所有的链式操作都将会克隆并创建一个新的数据库连接,所以GORM 对于多个 goroutines 的并发使用是安全的。
// 开启事务
BeforeSave
BeforeCreate
// 连表前的保存
// 更新时间戳 `CreatedAt`, `UpdatedAt`
// 保存自己
// 重载哪些有默认值和空的字段
// 链表后的保存
AfterCreate
AfterSave
// 提交或回滚事务
5、Gorm事务
事务模板
// 开启事务
tx := db.Begin()
// 在事务中执行一些数据库操作 (从这里开始使用 'tx',而不是 'db')
tx.Create(...)
// ...
// 发生错误回滚事务
tx.Rollback()
// 或者提交这个事务
tx.Commit()
事务例子一
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
}
事务例子二
func (m *Manager) TransactionHandle(callback func(db *gorm.DB) error) (err error) {
tx := m.Begin()
defer func() {
if r := recover(); r != nil {
klog.Errorf("Unexpected panic occurred, rollback transaction: %v", r)
err = fmt.Errorf("%v", r)
}
if err != nil {
rollBackErr := tx.Rollback().Error
if rollBackErr == nil {
err = fmt.Errorf("callback err : (%s) , rollBack success", err.Error())
} else {
err = fmt.Errorf("callback err : (%s) , rollBack err : (%s) ", err.Error(), rollBackErr.Error())
}
} else {
if err = tx.Commit().Error; err != nil {
err = fmt.Errorf("commit err : (%s)", err.Error())
}
}
}()
err = callback(tx)
return err
}