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().Errorif 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
}
上一篇:大学网课搜题公众号系统
下一篇:【数据结构】初始集合框架