介绍,数据库在更新、跑事务时,出现的第二大元素:锁。
一、MySQL锁的种类
1.1 3类
因为行锁粒度最小,所以是InnoDB中出现最多的,对别人的性能干扰最小。
1.2 全局锁 Flush tables with read lock
把所有的表,加读锁。
- 全局锁杀伤性极大,是指你业务就挂了
- 一般,线上MySQL都有主有备,所以全局锁是在备库中用
flush:
冲洗
1.3 表锁
1.数据锁
- 表锁杀伤性也很大
- 一般,是别的没有行锁的存储引擎,比如MyISM,才采用表锁
2.元数据锁:metadata lock,MDL锁
元数据,是指除了表的数据之外,还有表的属性。
业务在查询访问数据表时,自动会加元数据锁这个表锁。比如:因为查询时,现在是5列,再一查,别人把它改为4列了。这就会出现业务数据不一致问题。
1.4 行锁
1.读锁:共享锁,S锁,share locks
2.写锁:排他锁,X锁,exclusive locks
有两种类型:
读锁:共享锁,S锁,share locks。即我读的时候,你也能读。但是,你不能写。
写锁:排他锁,X锁,exclusive locks。即我在改写数据的过程中,别人既不能读,也不能写。
一行数据,你上了S读锁后,别人还可以加S读锁。
但是,你上了X写锁之后,别人什么锁都加不上。
比如网站要上线,如果不是滚动上线、大版本上线,可能会要临时发公告:凌晨3点,要修改数据或上线,业务要下线半小时。
此时,别人既不能访问,也不能读取。即用的是写锁:排他锁,exclusive locks。
exclusive:
only,独家的
3.在事务更新数据时,行锁是如何起作用的(图)
有的时候,是你的SQL写的没有问题,但是就是卡在那里。
这是因为,是别人的事务正在对这行数据进行更新,加了写锁。
日志优先:
是指每次停电又来电后,要先把日志的东西,优先重放一遍。
二、小结
2.1 锁的优缺点
锁的优点:必备,执行事务必备,或者执行一些业务必备。因为如果没有锁,会导致事务隔离的问题。
锁的缺点:
- 导致性能问题。
- 如果事务隔离的不彻底,会脏读。
Comments | NOTHING