mysql锁机制
一、锁分类
1.从对数据操作的类型(读\写)分
读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。
写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。
2.从对数据操作的粒度分
开销、加锁速度、死锁、粒度、并发性能,只能就具体应用的特点来说那种锁更合适
表锁(偏读)
行锁(偏写)
页锁
二、表锁
1.特点:
偏向MyISAM存储引擎,开销小,加锁快;无死锁;锁定粒度打,发生锁冲突的概率最高,并发读最低。
2.案例分析
建表sql
2.1.手动增加表锁
lock table 表名字 read(write),表名字2 read(write)
lock table mylock read,book write;
查看表上加过的锁
show open tables;
释放锁
unlock tables;
2.2.加读锁
2.3加写锁
3.案列结论
简而言之,就是读锁会阻塞写,但是不会阻塞读,而写锁则会把读和写都阻塞
4.表锁分析
三、行锁
1.特点
偏向InnoDB存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
InnoDB与MyISAM的最大不同:一是支持事务;二是采用了行级锁
2.复习老知识
并发事务处理带来的问题
更新丢失(Lose Update)
脏读(Dirty Reads)
不可重复读(Non-Repeatable Reads)
幻读(Phantom Reads)
3.案例分析
3.1建表sql
3.2行锁定基本演示
set autocommit=0;取消自动提交
set autocommit=1;设置自动提交
3.3无索引行锁升级为表锁
字段b是varchar 并且是加了索引,现在索引失效,
3.4间隙锁危害
3.5如何锁定一行
4.案例结论
5.行锁分析
6.优化建议
尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁。
合理设计索引,尽量缩小锁的范围。
尽可能较少检索条件,避免间隙锁。
尽量控制事务大小,减少锁定资源量和时间长度。
尽可能低级别事务隔离。
四、页锁(了解)
开销和加锁时间介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般。