今天练习golang操作mysql数据库时遇到个问题,没想明白原因。
我使用的gorm来操作mysql,我要实现的效果时,将指定条件记录的state字段改成1,用了两种方式来实现:
方式一、直接使用gorm的事务
err = e.Orm.Transaction(func(tx *gorm.DB) error {
db := tx.Model(&data).Where("id IN ?", []int{1,2,3}).Update("state", 1)
if err = db.Error; err != nil {
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
return nil
})
方式二、使用手动事务
db := e.Orm.Begin()
defer func() {
if err != nil {
db.Rollback()
} else {
db.Commit()
}
}()
db.Model(&data).Where("id IN ?", []int{1,2,3}).Update("state", 1)
if err = db.Error; err != nil {
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
return nil
经过测试发现,方式一可以正确获取到修改的记录数,方式二获取到的修改记录数一直是0, 这是什么原因呢?这两种方式具体有什么区别呢?