八、Mysql高级学习笔记之Mysql锁机制

Mysql锁机制

概述

定义:
八、Mysql高级学习笔记之Mysql锁机制
生活购物:
八、Mysql高级学习笔记之Mysql锁机制
锁的分类:
从数据操作的类型(读、写)分:
读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响
写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。

从对数据操作的颗粒度:
表锁;
行锁;

三锁

表锁(偏读):

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

建表SQL:
八、Mysql高级学习笔记之Mysql锁机制
加读锁:
八、Mysql高级学习笔记之Mysql锁机制
八、Mysql高级学习笔记之Mysql锁机制
八、Mysql高级学习笔记之Mysql锁机制
加写锁:
八、Mysql高级学习笔记之Mysql锁机制
八、Mysql高级学习笔记之Mysql锁机制
结论:
八、Mysql高级学习笔记之Mysql锁机制
简而言之,就是读锁会堵塞写,但是不会堵塞读,而写锁会把读锁和写锁都堵塞。

表锁分析:
八、Mysql高级学习笔记之Mysql锁机制
八、Mysql高级学习笔记之Mysql锁机制

行锁(偏写)

特点:

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

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

事务(Transation)及其ACID属性:
八、Mysql高级学习笔记之Mysql锁机制
并发事务处理带来的问题:
更新丢失(Lost Update)
八、Mysql高级学习笔记之Mysql锁机制
脏读(Dirty Reads)
八、Mysql高级学习笔记之Mysql锁机制
不可重复读(Non-Repeatable Reads)
八、Mysql高级学习笔记之Mysql锁机制
幻读(Phantom Reads)
八、Mysql高级学习笔记之Mysql锁机制

事务隔离级别:
八、Mysql高级学习笔记之Mysql锁机制

案例分析:

建表SQL
八、Mysql高级学习笔记之Mysql锁机制
行锁定基本演示:
八、Mysql高级学习笔记之Mysql锁机制
无索引行锁升级为表锁:
varchar 不用 ’ ’ 导致系统自动转换类型, 行锁变表锁 (自动转换类型,使用函数等都会导致索引失效)

间隙锁危害:

八、Mysql高级学习笔记之Mysql锁机制

八、Mysql高级学习笔记之Mysql锁机制

如何锁定一行:
八、Mysql高级学习笔记之Mysql锁机制
案例结论:
八、Mysql高级学习笔记之Mysql锁机制
行锁分析:
八、Mysql高级学习笔记之Mysql锁机制

八、Mysql高级学习笔记之Mysql锁机制
优化建议:
尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁;
合理设计索引,尽量缩小锁的范围;
尽可能较少检索条件,避免间隙锁;
尽量控制事务大小,减少锁定资源量和时间长度;
尽可能低级别事务隔离;

页锁

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