MySQL高级知识(十三)——表锁

前言:锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算机资源(如CPU、RAM、I/O等)的争用外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是全部数据库必须解决的一个问题,锁冲突也是影响数据并发访问性能的一个重要因素。从这个角度来讲,锁对数据库而言显得尤为重要,也更加复杂。html


1.锁的分类

#1.从对数据操做的类型来分数据库

读锁(共享锁)写锁(排它锁)并发

#2.从对数据操做的粒度来分性能

表锁行锁spa

2.表锁(偏读)

特色:偏向MyISAM存储引擎,开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的几率最高,并发度低。下面经过案例来讲明表锁的一些状况。线程

#1.建立mylock表,并插入5条数据。注意数据引擎使用的是MyISAMcode

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;

3.表锁(read)案例

#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分钟。

4.表锁(write)案例

#1.在A会话中对mylock表加写锁。

#2.在A会话中对mylock表进行读写操做。

分析:

因为A会话对mylock表加的写锁,因此读写操做都执行正常。

#3.在A会话中对其余表进行操做。

分析:

在A会话中对其余表进行读写操做都失败,由于A会话中mylock表的写锁并未被释放。

#4.在B会话中对mylock表进行读操做。

分析:

因为mylock表已经加写锁,而写锁为排它锁,所以在B会话中对mylock表进行读操做阻塞。

因为B会话中对mylock的读操做都阻塞,因此其余操做也是阻塞的。

5.表锁定分析

#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日,上午。


相关内容

MySQL高级知识系列目录

相关文章
相关标签/搜索