正确理解MYSQL事务的可重复读RR隔离级别与锁

1,mysql默认的事务隔离级别是可重复度。

可重复度就是在一个事务中对相同数据的多次查询将返回相同结果。

比如

事务1:

BEGIN;

SELECT age from student where id=1;

此时 age=10

.....业务代码(在此时别的事务或者直接在数据库中把age改成20)

SELECT * from T where id=1;

这里查到的age依然是10而不是数据库的中20.

原理是同一事务内多次查询时会返回该数据在当前事务的快照版本(快照读),对应的还有当前读。

2,可重复读与间隙锁

可重复读级别下条件列有索引时会添加间隙锁,阻止在此间隙内的insert操作,防止出现幻读。

InnoDB引擎在执行查询语句SELECT时,不会加锁。但是update、insert、delete操作会加行锁限制其他事物更新

3,应该采用什么隔离级别

在Oracle和SqlServer中,我们选择 Read Commited 作为默认隔离级别,为什么Mysql不选择 Read Committed(Read Commited)作为默认隔离级别,然后选择重复读取(Repeatable Read)作为默认隔离级别?

这是因为5.0之前的MySQL,binlog仅支持语句格式!并且此格式在读已提交的隔离级别下的主从复制中存在错误,因此Mysql使用可重复读作为默认的隔离级别!

但是5.1之后的版本已经支持行模式。所以MYSQL推荐的隔离级别应该为读已提交RC+行格式binlog

4,重点总结

可重复读只能保证同一个事务中相同数据多次查询时得到相同的结果。并不会限制在此过程中其他事务对数据库中此数据的更新操作。要解决多个事务对同一数据的并发写问题,必须自己加锁来实现,乐观锁(版本号)和悲观锁(forupdate)。

基于历史版本兼容的原因,MYSQL默认的隔离级别为RR可重复读。但实际使用中推荐采用RC读已提交级别。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值