一,表锁(偏读)

1,特点

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

2,表锁案例

1,表锁语法
表加锁:lock table 表名 read(write), 表名2 read(write), 其它;
释放表锁:unlock tables;
查看加过的锁:show open tables;
image.png
2,加读锁
为mylock 表加 read 锁(读阻塞写例子)

image.png
image.png
image.png
3,写加锁
image.png
image.png

3,案例结论

读锁会阻塞写,但是不堵塞读,而写锁会把读和写都堵塞
image.png

4,表锁分析

show open tables;
image.png
image.png
MyISAM的读写锁调度是写优先,这也是MyISAM不适合做写为主表的引擎,因为写锁后,其他线程不能做任何操作,大量的更新会使查询很难得到锁,从而造成永远阻塞。

二,行锁(偏写)

1,特点

偏向InnoDB存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁

2,行锁支持事务

1,事务及其ACID属性

image.png

2,并发事务处理带来的问题

1,更新丢失(Lost Update)
image.png
2,脏对(Dirty Reads)
image.png
3,不可重复读(Non-Repeatable Reads)
image.png
4,幻读(Phantom Reads)
image.png

3,事务隔离级别

查看当数据库的事务隔离级别:show variables like 'tx_isolation'
image.png

3,行锁案例

1,建表SQL
image.png
2,行锁定基本演示
image.png
3,无索引行锁升级为表锁
varchar 不用 ‘’导致系统自动转换类型,行锁变表锁
4,间隙锁危害
image.png
image.png
5,面试题:常考如何锁定一行
begin ...... commit
image.png

4,案例结论

image.png

5,行锁分析

show status like 'innodb_row_lock%'
image.png
image.png

6,优化建议

  • 尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
  • 合理设计索引,尽量缩小锁的范围
  • 尽可能较少检索条件,避免间隙锁
  • 尽量控制事务大小,减少锁定资源量和时间长度
  • 尽可能低级别事务隔离

    三,页锁

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