一、MySQL锁机制
一、锁的分类
1、从对数据操作的类型(读/写)分
读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。
写锁(排它锁):当写操作没有完成前,它会阻断其他写锁和读锁。
2、从对数据操作的粒度分为
表锁
行锁
二、三锁
1、表锁(偏读)
1.1、特点:偏向MyISAM存储引擎,开销小,加锁快,无死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低
1.2、案例分析
1.2.1建表
lock table 表名字 read(write),表名字2 read(write),其它;#手动增加表锁
show open tables; #查看数据库中表是否加锁,In_use为1表示表加了锁
unlock tables; #释放表锁
1.2.2、为mylock表加read锁(读阻塞写例子)
1)、开启两个连接分别为session1和session2。
2)、通过session1给表加读锁,session2不给任何表加锁
3)、因为读锁是共享锁,所以此时session2去读取数据都可以获取到,但不可对表数据进行变更。
4)、通过session1尝试去修改加锁后表中数据,发现并不能修改。
5)、session1只能查询加锁表的数据,不能查询其它表,session2可以查询加锁表和其它表
6)、通过session2去修改被session1锁住的表数,发现session2进入阻塞状态,在等待session1释放锁。在session1释放锁的瞬间,处于阻塞状态的session2修改了表数据。
1.2.3、为mylock表加write锁(MyISAM存储引擎的写阻塞读例子)
1)、开启两个连接分别为session1和session2。
2)、通过session1给表加写锁,session2不给任何表加锁
3)、因为写锁是排它锁,所以此时的session1可以对锁表进行读取或修改操作,但session2去读取或修改锁表的数据时处于阻塞状态,等待session1释放锁。
4)、session1只能查询加锁表的数据,不能查询其它表
1.2.4案例结论
MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行增删改查前,会自动给涉及的表加写锁。
MySQL的表级锁有两种模式
表共享读锁
表独占写锁
结论:
1、对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读释放锁以后,才会执行其它进程的操作
2、对MyISAM表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放以后,才会执行其他进程的读写操作
简而言之读锁会阻塞写,但是不会阻塞读,而写锁则会把读和写都阻塞
1.2.5、表锁分析
2、行锁(偏写)
2.1、特点:①偏向InnoDB存储引擎,开销大,加锁慢,会出现死锁,锁定粒度最小,发生锁冲突的概率最低,并发度也最高。②InnDB与MyISAM的最大不同有两个点:一是支持事务;二是采用了行级锁
2.2、案例分析
2.2.1、建表
2.2.2、
索引失效会导致行锁变表锁
间隙锁的危害
结论:
行锁分析:
优化建议: