MySQL性能优化(三)锁

MySQL性能优化(三)锁

1. 概述

image.png

image.png

image.png

image.png

2. MyISAM的表锁

image.png

2.1 读锁

#设置读锁
LOCK TABLE testmyisam READ

2.1.1 设置读锁后,在同一个会话中,对本表只能执行读操作,不能执行修改、删除操作。

SELECT * FROM testmyisam
  • 能够执行读操作 image.png

  • 执行修改、删除操作会报错 image.png

2.1.2 在同一个会话中对其他表的任何操作都会报错

image.png

2.2.1 在另一个会话中对本表能够立即执行读操作,写操作或者删除操作需要等待

SELECT * FROM testmyisam
UPDATE testmyisam SET name = 'amos2' WHERE id = 1
DELETE FROM testmyisam WHERE id = 1

image.png

将读锁释放后,第二个会话的修改、删除操作可以执行成功

UNLOCK TABLES

image.png

2.2.2 在另一个会话中,对于其他表的任何操作都可以正常进行

2.3 同一个会话中,查询时候使用本表的别名也会报错

SELECT m.* FROM testmyisam m

image.png

这时候如果加锁,需要指明表的别名

LOCK TABLE testmyisam as m READ

当然这种情况下,只能锁住名称为m的锁,查询testmyisam表依然会报错。 image.png

2.2 写锁

加锁的命令

LOCK TABLE 'testmyisam' WRITE

2.2.1 加锁后,在同一个会话中允许对本表的修改、删除,但是对本表查询会处于等待状态

SELECT * FROM testmyisam
UPDATE testmyisam SET name = 'amos2' WHERE id = 1
DELETE FROM testmyisam WHERE id = 100

image.png

image.png

2.2.2 加锁后,同一个会话中,对其他表的所有操作会报错

SELECT * FROM testinno
UPDATE testinno SET age = 15 WHERE id = 5

image.png

2.2.3 加锁后,另一个会话的对本表的所有操作都处于等待中

image.png

2.2.4 加锁侯,另一个会话对其他表的所有操作不受影响

image.png

MyISAM表锁的总结

image.png

3.Innodb

3.1 概述

image.png

image.png

image.png

3.2 行锁

BEGIN //必须先开启事务
SELECT * FROM testinno WHERE id = 1 FOR UPDATE
COMMIT //提交事务,会释放锁

3.2.2 在同一会话中,可以查询、修改、删除该行数据

image.png

3.2.3 在另一个会话中,可以查询该行数据,但是修改该行数据会一直等待

SELECT * FROM testinno WHERE id = 3 //正常
UPDATE testinno SET age = 15 WHERE id =3 //等待

image.png

3.3 表锁

Innodb的表锁和MyISAM的表锁差别不大 开启一个新事务的时候会解锁表 image.png

4.面试题

image.png

image.png

image.png

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×