mysql 锁
1、flush tables with read lock 全局锁
导致全库只读
mysqldump-single-transaction (通过repeatable read 隔离级别启动事务)
set global read-only 一般用来判断主备库
2、表级锁
lock table unlock table 表锁
MDL 元数据锁 (开始第一次查询是获取读锁,事务提交时才会释放MDL读锁)
小表的DDL语句会导致全库崩溃
select * from table 获取MDL读锁
alter table add index (a) blocked 等待读锁释放获取MDL写锁
后续所有的的操作都会被blocked
3、行级锁(引擎层实现)
两阶段锁: 真正查询时使用,提交时释放。 尽量将可能同时操作的语句放到后面
死锁,死锁检测
---innodb_lock_wati_time 50 默认
---innodb_deadlock_detect on
死锁发生的场景
----并发100线程 同时修改某条记录 会发现cpu100%,但实际更新操作缺很少(这是因为死锁检测耗费了大量cpu)
----解决方案 将单条记录拆成多条,降低死锁的可能性
4、当前读(更新操作读当前最新版本)
查询当前读
写锁 :select * from table for update
读锁: select * from table in share mode
5、read-view
当前未提交的所有事务id
小于最小事务id 可见
大于最大事务id 不可见
read-view中的事务id不可见
’