重点
1.使用事务时必须通过 defer func() 匿名函数 recover 捕捉错误,panic错误和error ,如果错误不为nil,就会滚Rollback()
2.如何判断mysql出现事务表锁,可以通过navicat mysql 工具查看。
eg:从左上角工具栏,选择 工具->服务器监控->mysql(选择自己的数据库类型)->state字段
字段内容是:waiting for table metadatalock
证明有表锁,然后删除这些操作记录
3.另外通过sql语句查看产生锁的记录sql:select * from information_schema.innodb_trx;
找到对应的字段,trx_thread_id,根据记录的id,去找步骤2中的id字段然后删除
// 再唠叨一下,事务一旦开始,你就应该使用 tx 处理数据
tx := db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
if err := tx.Error; err != 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
}
如果没有事务的需求,您可以在初始化时禁用它,这将获得大约 30%+ 性能提升
// 全局禁用
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
SkipDefaultTransaction: true,
})