前言:锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算机资源(如CPU、RAM、I/O等)的争用外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是全部数据库必须解决的一个问题,锁冲突也是影响数据并发访问性能的一个重要因素。从这个角度来讲,锁对数据库而言显得尤为重要,也更加复杂。html
#1.从对数据操做的类型来分数据库
读锁(共享锁)和写锁(排它锁)并发
#2.从对数据操做的粒度来分性能
表锁和行锁spa
特色:偏向MyISAM存储引擎,开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的几率最高,并发度低。下面经过案例来讲明表锁的一些状况。线程
#1.建立mylock表,并插入5条数据。注意数据引擎使用的是MyISAM。code
drop table if exists mylock; CREATE TABLE mylock ( id INT PRIMARY KEY auto_increment, name VARCHAR (20) NOT NULL ) ENGINE MyISAM DEFAULT charset = utf8; insert into mylock (name) values ('a'); insert into mylock (name) values ('b'); insert into mylock (name) values ('c'); insert into mylock (name) values ('d'); insert into mylock (name) values ('e');
#2.手动增长表锁命令。htm
lock table tablename1 read(write),tablename2 read(write);
#3.查看表是否被加锁。blog
若是In_use显示不为0,则表示表被加锁。进程
#4.释放表锁命令
unlock tables;
#1.在mylock表上加读锁。将当前会话命名为A。
在A会话中查询mylock中的数据。
数据查询正常,没有任何问题。
#2.再开一个会话,命名为B,查询mylock中的数据。
数据查询正常,没有任何问题。
#3.进行其余操做。
①在A会话中进行更新操做。
分析:
提示mylock表被加锁,不能进行更新操做。缘由:mylock正被读锁锁住,未解锁不能进行更新操做。
②在B会话中读其余表。
分析:
A会话mylock表的读锁,并不影响B会话对mylock表和其余表的读操做。
③在A会话中读其余表。
分析:
因为A会话对mylock表加了读锁,在未解锁前,不能操做其余表。
④在B会话中修改mylock表中的内容。
分析:
出现了阻塞状况,缘由:因为A会话对mylock表加锁,在锁未释放时,其余会话是不能对mylock表进行更新操做的。
⑤在A会话中对mylock表进行解锁操做,注意观察B会话中的变化。
分析:
在A会话中对mylock表解锁后,B会话更新操做成功,可看到B会话中的更新操做等待了22分钟。
#1.在A会话中对mylock表加写锁。
#2.在A会话中对mylock表进行读写操做。
分析:
因为A会话对mylock表加的写锁,因此读写操做都执行正常。
#3.在A会话中对其余表进行操做。
分析:
在A会话中对其余表进行读写操做都失败,由于A会话中mylock表的写锁并未被释放。
#4.在B会话中对mylock表进行读操做。
分析:
因为mylock表已经加写锁,而写锁为排它锁,所以在B会话中对mylock表进行读操做阻塞。
因为B会话中对mylock的读操做都阻塞,因此其余操做也是阻塞的。
#1.使用以下命令查看是否有表被锁定。
show open tables where In_use>0;
#2.使用以下命令分析表锁。
show status like 'table%';
主要注意两个变量的值:
①Table_locks_immediate:产生表级锁定的次数,表示可当即获取锁的查询次数,每当即获取锁一次该值加1。
②Table_locks_waited:出现表级锁定争用而发生等待的次数(不能当即获取锁的次数,每等待一次锁该值加1),此值高则说明存在较严重的表级锁争用状况。
注意数据库引擎为MyISAM。
①对MyISAM表加读锁,不会阻塞其余进程对同一表(mylock)的读操做,可是会阻塞对同一表的写请求,只有当读锁释放后,才会执行其余进程的写操做。
②在加读锁并未释放锁时,该进程不能对同一表(mylock)进行写操做,而且也不能对其余表进行操做。
③对MyISAM表加写锁,会阻塞其余进程对同一表(mylock)的读和写操做,只有当读锁释放后,才会执行其余进程的写操做。
④在加写锁并未释放锁时,该进程不能对其余表进行操做。
简而言之:读锁会阻塞写,可是不会阻塞读,而写锁会把读和写都阻塞。
此外,MyISAM的读写锁调度是写优先,这也是MyISAM不适合作写为主的表的引擎,由于写锁后,其余线程不能作任何操做,大量的更新会使查询很可贵到锁,从而形成长时间阻塞。
by Shawn Chen,2018.6.28日,上午。