mysql flush table导致的锁
会话1: select sleep(500) from t_biz1 where .....
会话2: set session wait_time_out = 5000; flush tables with lock;
会话3: select * from t_biz1 where ....
会话4: select * from t_biz2 where ....
会话5: unlock tables;
结论:flush时一直在执行select的表(慢查询)在flush的同时再select会阻塞
timeline | session1 | session2 | session3 | session4 | session5 | ||
T1 |
sleep(500) -- 秒 from t_biz1 where ..... |
|
|
||||
T2 |
set session wait_time_out = 5000; -- 5秒 flush tables with lock; (阻塞) 这个lock只影响session1中的表,不影响session2后续的其它session中的其它表) 相当于一个快照,看看照下来的那一瞬间有哪些session还在执行,其中的表就会被lock,直到unlock才会释放 |
||||||
T3 |
select * from t_biz1 where .... (被session2阻塞,因为t_biz1在快照中)
|
||||||
T4 |
select * f rom t_biz2 where .... (可执行,因为t_biz2不在快照中) |
||||||
T5 |
只能新启动一个session来unlock? unlock tables; |
||||||
unlock之后(说明session1肯定也结束了)可执行 |
前提:
会话1的sleep时间大于会话2
会话1执行后,立刻执行会话2,此时会话1在执行,会话2阻塞住
再执行会话4,可以正常执行(因为这个表是在flush之后的发起select的)
再执行会话3,阻塞。此时其实是被会话2阻塞住了。如果会话3阻塞超时就会有异常抛出
如果会话1结束,会话2开始执行,会话3仍然阻塞
会话5执行后,会话3才会结束阻塞状态开始执行