1.引入
上一节课,我们呢,查看了在对一个表添加读锁,然后在不同的会话中查看对数据的不同操作,可以发现读锁在读取的时候可以共享数据,写的时候阻塞。那么下面呢。我们就一起来看看添加写锁又会有什么样子的变化呢?
2.写锁案例讲解
(1).数据库表内容准备
DROP TABLE IF EXISTS `admin`;
CREATE TABLE `admin` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(10) NOT NULL,
`password` varchar(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=myisam DEFAULT CHARSET=utf8;
//注意这一个数据表的引擎是myisam
添加数据内容并查看
(2).给数据库表admin添加一个写锁(在会话1中)
lock table admin write;
(3).操作数据库表内容
会话1中进行对加锁数据表的读取操作,发现可以读取。
在会话1中进行对加锁数据表修改操作,发现可以进行操作。
在会话1中去读取其他数据表的内容,发现不可以,因为加锁的数据库表的栈没有清除。
会话2读取其他数据表内容,发现可以读取。
会话2读取加锁数据库表内容,发现处于阻塞状态,然后在会话1中取消加锁,立刻执行查询操作。
会话2进行其他操作的时候都不能够进行其他的操作。
3.总结
通过上面的操作,我们可以把读锁和写锁的操作总结如下:
读锁会阻塞写,但是不会堵塞读取操作。写锁会把读操作和写操作都堵塞。
4.读写锁的其他相关操作
(1).查看哪些被加了锁
show open tables;
//有1的就是被加了锁。
(2).如何分析表锁定
可以通过检查table_locks_waited 和table_locks_immediate状态变量来分析系统上的表锁定。
SQL:show status like 'table%';
由于我们的admin数据库表使用是是Myisam引擎,那么Myisam的读写调度是写优先,这也就是Myisam不适合作为写为主的主表的引擎,因为添加写锁以后,其他的线程不能够做任何的操作,大量的更新会使得查询很难得到锁,进而造成永远阻塞。