select e.job, count(*) num from emp e group by job order by null;
后缀加上 order by null 可以强制实现按照数据库中记录出现的顺序来进行排序,因为mysql5.6版本会自带隐式排序,所以有时候会特别有用,但mysql8.0版本已经取消了这一点,不会在隐式排序了。
开启一个Console,执行下述语句:
begin;
update student
set name='段段'
where id = 1;
select *
from student;
commit;
再开启一个Console,执行下述语句:
begin;
# 被锁住了??
select * from student;
select * from student for update;
commit;
就会发现当前读的操作一直在堵塞等待,直到超时:
究其原因是:
在RR中,快照会在事务中第一次查询语句执行时生成,只有在本事务中进行数据更改才会更新快照,也就是说,其他事务进行数据更改是不会更新快照的。
除非其他事务进行了提交后,当前事务采用当前读(也就是加for update)的方式进行查询才能查到。
但这种情况下,在其他事务提交之前,因为临键锁属于读写锁一起上的缘故,select for update语句会一直堵塞直到超时。