根据加锁的范围,MYSQL里面的锁大致分为全局锁、表级锁、行锁。
全局锁:对整个数据库实例加锁。命令:Flush tables with read lock (FTWRL)
表级锁:一种是表锁,一种是元数据锁(meta data lock,MDL)。
行锁:
1、全局锁
全局锁命令:Flush tables with read lock (FTWRL)
应用场景: 做全库逻辑备份。
single-transaction 方法只适用于所有的表使用事务引擎的库。
2、表级锁
表锁语法:lock tables … read/write
,比如lock tables t1 read, t2 write;
释放锁:unlock tables
应用场景:一般在数据库引擎不支持行锁的时候会被用到。
在 alter table 语句里面设定等待时间,如果在这个指定的等待时间里面能够拿到 MDL 写锁最好,拿不到也不要阻塞后面的业务语句,先放弃:
ALTER TABLE tbl_name NOWAIT add column ...
ALTER TABLE tbl_name WAIT N add column ...
3、行锁
行锁:在引擎层由各个引擎自己实现的。行锁针对数据表中行记录的锁。
两阶段锁协议:在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。
死锁:在并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就会导致这几个线程都进入无限等待的状态。
死锁检测:发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数 innodb_deadlock_detect = on,表示开启这个逻辑。