1. 根据加锁的范围
锁大致可以分为,全局锁,表级锁,行级锁。
1.1.全局读锁的 方法:
命令 flush tables with read lock (FTWRL)
当需要把整个库处于只读状态,可以使用这个命令,之后数据更新语句,数据定义语句,更新类事务提交 都会阻塞。
如果你在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆;
如果你在从库上备份,那么备份期间从库不能执行主库同步过来的binlog,会导致主从延迟。
1.2 表级锁
MySQL里面表级别的锁有两种:一种是表锁,一种是元数据锁(meta data lock,MDL)。
1.3 行锁
怎么减少 行锁对性能的影响?
1.在 innodb 事务中,行锁是在需要的时候加上去的,但并不是不需要了就立马释放掉,而是等事务结束后释放。这就是两阶段锁
所以-如果一个事务需要锁多个行,要把最有可能造成锁冲突,最可能影响并发的锁尽量往后放。
2. 当并发系统中几个不同的线程出现循环资源依赖,涉及的线程都在等待别的线程进行资源释放,就会导致几个线程都进入无限等带的状态称称为 死锁。
出现死锁后,两种策略:
1.直接进入等待,到达超时时间可以通过 innodb_lock_wait_timeout 进行设置。 默认50S
2.发起死锁检测,发现死锁后,主动回滚死锁中的某一事务,让其它事务继续执行。设置参数 innodb_deadlock_delect 为 on ,表示开启这个逻辑
死锁检测 会额外的负担 造成cpu看着利用率很高 但是没有执行几个事务。
解决方法:
1.自确定,如果确保业务中不会出现死锁就关闭死锁检测。 存在风险
2.控制并发度。
建议在服务层做,如果有中间键 可以在中间件中实现。