数据库的锁

101 阅读2分钟

锁的目的

解决并发抢占资源的问题

全局锁

全局锁就是对整个数据库示例加锁。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