MySQL锁分类
全局锁针对整个数据库的锁,求中包括读锁和写锁
读锁(共享锁): 他阻止其他用户更新数据,但他允许他们读取数据,这在需要一段时间内保持数据一致性很重要
**写锁(排它锁):**他会阻止其他用户读取和更新数据,这在你需要修改一些大量数据,并且不希望其他用户在这堵段时间内干扰有很大作用。
注意:全局锁得开销非常大,因为他会阻止其他所有的数据修改操作,并且在高并发情况可能导致大量的的线程等待锁定,因为应避免在生产环境中使用全局锁,或者尽量减少使用全局锁持有时间,只有在INNODB引擎中使用
在数据库中开启(读写)锁
FLUSH TABLES WITH READ LOCK
FLUSH TABLES WITH WRITE LOCK
释放锁
UNLOCK TABLES
表级锁是mysql中最基本的锁策略,特点是开销小,加锁快,不会出现死锁,锁力度大,发生锁冲突的概率最高,并发度最低
表锁得两种模式:
表共享锁(表读锁):允许一个事务锁定的表进行读取操作,不允许其他事物对其进行写操作,但是可以进行读操作,读锁之间是不会相互阻塞
表独占锁(表写锁):允许一个事务锁定的表进行读取和写入(更新)操作,但对其他任何事务都不能对该表进行任何操作,必须等待表写锁结束,写锁会阻塞其他所有锁,包括读锁和写锁。
在MySQL中对于MyISAM引擎表,读操作会自动加上读锁,对与写操作,会自动加上写锁
在InnoDB引擎汇总在必要情况下会使用表锁,
表锁使用场景
哪些命令会发生表级锁
表锁使用案例
-- 员工表开启表锁
LOCK TABLES tb_employee READ
-- 查看表锁使用情况
SHOW OPEN TABLES WHREE IN_USE>0
-- 更新表是不能进行更新的
UPDATE tb_employee SET NAME="张三" WHERE id=1
-- 释放所有表锁
UNLOCK TABLES
表锁得风险
注意:行锁只能在事务中使用,
行锁使用场景
哪些场景会导致发生行锁
使用案例
-- 开启事务(行锁只能在事务中使用)
START TRANSACTION
-- 开启一个排它锁
select * from tb_employee where id = 1 for update
-- 开启一个共享锁
-- select * from tb_employee where id = 1 lock in share mode
commit
-- 查看所有锁情况
select * from performance_schema.data_locks
行锁有哪些风险
乐观锁:
乐观锁使用场景
乐观锁得缺点
悲观锁得缺点
间隙锁得优缺点