Mysql的锁是为了处理并发添加的锁概念。java开发中也会用到锁概念,其实锁跟并发是孪生子。有并发那就要考虑数据的ACID。锁能够保证并发时的串行。
那Java中的锁有重量级锁,轻量级锁,还有偏向锁等概念。
mysql中也有1-全局锁,2-表级锁,3-行锁的概念
1-全局锁。flush-table-with-read-lock.(FTWRL)命令给数据库添加全局锁,这样的话,所有的事务都只能读,不能修改数据。一般用于数据备份的时候,所有的更新操作-表修改/删除操作都会被阻塞。全局锁锁定之后,所有的修改操作都不能执行,这样的操作很危险:01:主库不能进行业务操作,系统停摆,02-从库不能即使同步binLog,主从数据不同步。
所以在支持事务的数据库引擎中,可以使用我们之前讲到的可重复读隔离级别这一概念代替全局锁,但是前提是数据库引擎要支持事务,所以InnoDB代替MySAM的原因之一。
2-表级锁
2.1 元数据锁-meta data lock MDL ,mysql5.5加了MDL。该锁的主要用出是防止多个事务同时修改表的元数据,比如column信息。当然MDL分为读写锁
需要注意的是,在读取表数据的时候,也要申请表的MDL read锁,比如
session A read t1,那么sessionA 就拥有t1的MDL read锁。
session B write t1,需要申请t1的MDL write 锁,会被阻塞。
那session C read t1. 就会被session B阻塞。如果这个时候,t1的查询频繁,且有异常重试机制,就会很快把数据库线程撑满。
2.2 表锁锁住整个表,多个事务串行。但是有个重要的点要注意
tr1事务 lock a read, lock b write 。那么tr1事务只有a的读锁,没有写锁,其他事务对a的写就会被阻塞。其他事务对b的read也会被阻塞。所以表锁的返回还是太大。