1.全局锁
全局读锁
作用:让整个库处于只读状态
命令:
1. Flush tables with read lock (FTWRL)
2. set global readonly=true
两个命令差异:
- 适用所有引擎、客户端异常可以自动释放锁。
- readonly 会有别的判断用途、客户端异常不会自动释放锁
全库备份::
- 支持事务的引擎:
官方自带的逻辑备份工具是 mysqldump。当 mysqldump 使用参数–single-transaction 的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于 MVCC 的支持,这个过程中数据是可以正常更新的。 - 不支持事务的引擎:
用FTWRL来锁定库
2.表锁
加锁:locok tables 表名称 read/write
释放:unlock tables … 或者客户端断开自动释放
3. 表元数据锁(MDL)
不用显式添加
增、删、改添加读锁,表变更时添加写锁
4. 行锁
行锁就是针对数据表中行记录的锁
在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。这个就是两阶段锁协议
如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放
5. 死锁和死锁检测
当出现死锁以后,有两种策略:
一种策略是,直接进入等待,直到超时。这个超时时间可以通过参数 innodb_lock_wait_timeout 来设置。在 InnoDB 中,innodb_lock_wait_timeout 的默认值是 50s
另一种策略是,发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数 innodb_deadlock_detect 设置为 on,表示开启这个逻辑。
进行并发控制