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