锁的目的
解决并发抢占资源的问题
全局锁
全局锁就是对整个数据库示例加锁。mysql提供加全局锁的方法,命令是 FLush tables with read lock。使用这个命令,会让整个库处于只读状态,其他线程的一下语句会被阻塞:数据更新语句、数据定义语句和更新类事务提交语句。
全局锁的使用场景
全库逻辑备份
表级锁
1.表锁 2.元数据锁(meta data lock),当对一个表做增删改查的时候,加MDL读锁。当要对表做结构变更操作的时候,加MDL写锁。
如何安全地给小表加字段
首先我们要解决长事务,事务不提交,就会一直占着MDL锁。在mysql的Information_schema库的Inndb_trx表中,你可以查到当前执行中的事务。如果你要做DDL变更的表刚好有长事务在执行,要考虑暂停DDL,或者KILL掉这个长事务。
如果表的数据马上需要变更,用下面两条sql ALTER TABLE tbl_name NOWAIT add column ... ALTER TABLE tbl_name WAIT N add column ...
行锁-两阶段锁说起
在innodb事务中,行锁是在所需的时候才加上的,但并不是不需要了就立刻释放,而是要等待事务结束后才释放。这就是两阶段的锁协议。
死锁和死锁检测
死锁:当并发系统中不同线程出现循环资源依赖,涉及的线程都等待别的线程释放资源时,就会导致这个几个线程进入无限等待的状态。
出现死锁的策略
1:直接进入登台,直到超时。通过 innodb_lock_wait_timeout来设置,默认值50s 2:发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务继续执行。将参数 innodb_deadlock_detect = one