MySQL

4 mysql锁机制

2018-06-07  本文已影响1人  Java及SpringBoot

4.1 概述

4.1.1 定义

clip_image217.jpg

4.1.2 生活购物

clip_image219.jpg

4.1.3 锁的分类

从数据操作的类型(读、写)分

读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响

写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。

从对数据操作的颗粒度

表锁

行锁

4.2 三锁

4.2.1 表锁(偏读)

特点

偏向MyISAM存储引擎,开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发最低

案例分析

建表SQL

clip_image221.jpg clip_image223.jpg

加读锁

clip_image225.jpg clip_image227.jpg clip_image229.jpg

加写锁

clip_image231.jpg clip_image233.jpg

案例结论

clip_image235.jpg clip_image237.jpg

表锁分析

clip_image239.jpg clip_image241.jpg clip_image243.jpg

4.2.2 行锁(偏写)

特点

偏向InnoDB存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁

由于行锁支持事务,复习老知识

事务(Transation)及其ACID属性

clip_image245.jpg

并发事务处理带来的问题

更新丢失(Lost Update)

clip_image247.jpg

脏对(Dirty Reads)

clip_image249.jpg

不可重复读(Non-Repeatable Reads)

clip_image251.jpg

幻读(Phantom Reads)

clip_image253.jpg

事务隔离级别

clip_image255.jpg

案例分析

建表SQL

clip_image257.jpg

行锁定基本演示

clip_image259.jpg

无索引行锁升级为表锁

varchar 不用 ' ' 导致系统自动转换类型, 行锁变表锁

间隙锁危害

clip_image261.jpg clip_image263.jpg

面试题:常考如何锁定一行

clip_image265.jpg

案例结论

clip_image267.jpg

行锁分析

clip_image269.jpg clip_image271.jpg

优化建议

尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁

合理设计索引,尽量缩小锁的范围

尽可能较少检索条件,避免间隙锁

尽量控制事务大小,减少锁定资源量和时间长度

尽可能低级别事务隔离

4.2.3 页锁

Subtopic

开销和加锁时间界于表锁和行锁之间:会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

了解一下即可

上一篇 下一篇

猜你喜欢

热点阅读