gorm 修改事务维度的隔离级别

gorm 修改事务维度的隔离级别

大家如果看过MySQL事务隔离级别的相关文档,应该知道InnoDB引擎的默认隔离级别是RR[可重复读],但是一般互联网公司为了确保读到最新的已提交数据,都会将事务的隔离级别设置为RC[读已提交],但是最近有一个应用场景时,需要读到数据库在当前执行select语句时刻的数据,而不是最新的数据,那么这个时候就需要事务的隔离级别是RR才可以做到,至于为什么,建议复习MVCC机制
需要修改事务的隔离级别,但是又不想影响其他业务,于是使用了gorm封装好的方法来修改下一个将要开启的事务的隔离级别
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这其中也去看了一下源码,MySQL本身是可以修改三种维度的隔离级别的: MySQL文档
在这里插入图片描述
在这里插入图片描述
gorm的这种方法底层其实是调用的go-sql-driver库然后执行的SET TRANSACTION ISOLATION LEVEL xxx,所以只对下一个即将开启的事务生效
其他三种维度没有封装对应的方法,平时开发一般也用不到…
PS:RR和RC级别下进行写操作时加锁粒度不同,RR加行锁和间隙锁,RC加行锁,需要注意的是锁不是事务维度的,而是数据库维度的,也就是修改事务的隔离级别时需要注意当前事务的锁的粒度,注意提升锁粒度时是否会影响到当前其他业务代码原来的写操作

### GORM 框架中事务的使用 在 GORM 中,事务管理是一个重要的功能,它能够确保一组数据库操作要么全部成功执行,要么完全回滚。这有助于保持数据一致性并减少潜在错误。 #### 手动事务 GORM 提供了一个 `Begin` 方法用于启动手动事务。开发者可以显式调用 `Commit` 或 `Rollback` 来控制事务的结果。这种方式提供了更大的灵活性,适合复杂的业务逻辑场景[^1]。 以下是手动事务的一个典型代码示例: ```go func manualTransaction(db *gorm.DB) error { tx := db.Begin() defer func() { if r := recover(); r != nil { tx.Rollback() } }() // 数据库操作 1 if err := tx.Create(&User{Name: "Alice"}).Error; err != nil { tx.Rollback() return err } // 数据库操作 2 if err := tx.Model(&User{}).Where("name = ?", "Bob").Update("age", 20).Error; err != nil { tx.Rollback() return err } // 如果一切正常,则提交事务 return tx.Commit().Error } ``` #### 自动事务 除了手动方式外,GORM 还支持通过 `.Transaction` 方法开启自动事务处理。该方法会接收一个函数作为参数,在此函数内部的所有数据库操作都会被包裹在一个事务中运行。如果发生任何错误,整个事务会被自动回滚;如果没有错误则提交事务[^3]。 下面展示如何利用`.Transaction`简化事务管理过程: ```go func autoTransaction(db *gorm.DB) error { return db.Transaction(func(tx *gorm.DB) error { // 数据库操作 1 if err := tx.Create(&User{Name: "Charlie"}).Error; err != nil { return err } // 数据库操作 2 if err := tx.Model(&User{}).Where("name = ?", "David").Update("age", 25).Error; err != nil { return err } return nil }) } ``` 两种事务模式各有优劣,具体选择取决于实际需求以及项目复杂度等因素。对于简单的增删改查操作推荐采用自动事务机制以降低开发成本;而对于涉及多步计算或者条件判断的情况可能更适合使用手动事务以便更好地掌控流程走向。 另外需要注意的是,默认情况下 GORM 的表命名规则遵循蛇形小写加复数形式 (snake_case_plural),比如定义名为 `ProductCategory` 的模型类最终映射到数据库里的表格名称将是 `product_categories` [^4]。因此当配置事务时也要考虑到这一点以免因误解而导致查询失败等问题出现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值