MySQL表锁
悲观者从机会中看到困难。乐观者从困难中看到机会。
——温斯顿·丘吉尔
如果我们想对学生表(t_student)加表锁,可以使用下面的命令:
// 表级别的共享锁,也就是读锁;
// 允许当前会话读取被锁定的表,但阻止其他会话对这些表进行写操作。
lock tables t_student read;
// 表级别的独占锁,也就是写锁;
// 允许当前会话对表进行读写操作,但阻止其他会话对这些表进行任何操作(读或写)。
lock tables t_student write;
需要注意的是,表锁除了会限制别的线程的读写外,也会限制本线程接下来的读写操作。
举个例子,如果在某个线程 A 中执行 lock tables t1 read, t2 write;这个语句,则其他线程写 t1、读写 t2 的语句都会被阻塞。同时,线程 A 在执行 unlock tables 之前,也只能执行 t1、读写 t2 的操作。连写 t1 都不允许,自然也不能访问其他表。
现在我对 t_test 表执行 lock tables t_test read,也就是对 t_test 表加了表级别的共享锁。
这时候本线程(会话)可以读t_test表的数据,但是不能写t_test表的数据
同时本线程不能访问其它表,比如下面我在本线程读t_student 表就报错了。
其他线程可以对 t_test 表进行读操作,但是也不能对 t_test 表进行写操作,这时候写操作会发生阻塞
要释放表锁,可以使用下面这条命令,会释放当前会话的所有表锁:
unlock tables
另外,当会话退出后,也会释放所有表锁。
在还没有出现更细粒度的锁的时候,表锁是最常用的处理并发的方式,不过尽量避免在使用InnoDB引擎的表使用表锁,因为表锁的颗粒度太大,会影响并发性能,InnoDB厉害的地方在于实现了颗粒度更细的行级锁
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号