go gorm 事务的正确用法

重点

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,

})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值