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才会结束阻塞状态开始执行

posted on 2023-06-20 13:02  北方白杨  阅读(72)  评论(0编辑  收藏  举报