mysql的锁
锁的颗粒度,决定并发度和速度
InnoDB的行锁是针对索引加的锁,不是针对记录加的锁。并且该索引不能失效,否则都会从行锁升级为表锁;
rr的业务场景:多个相关的查询,同时取出来使用,并且要保证业务含义一致
1》 对数。 上个月的余额,本月的账单(3个结果),当前的余额(修改了1个结果),正常应该是上月余额-本月账单==当前余额,现在因为2次读时,差了1个更新事务,所以对不上了
2》 汇总数额不对。同一个事务内,先查详情,后聚合count,详情加起来和count返回的结果不一致
3》 当前读的结果会有遗漏。比如 update user set tag='成年' where age >17; 查询时有3行满足,真正执行update时,可能别的事务又插入了1行数据,导致新插入的数据满足条件但是没有被更新。
delete from user where age < 18; # 会有漏网之鱼
gap锁,在rr级别,当前读(比如update delete的where条件)时,除了锁记录,也会锁住范围