共计 436 个字符,预计需要花费 2 分钟才能阅读完成。
记一个读写锁引起的数据库崩溃
我们应该都有意思:对一个大表做修改表结构操作可能会引起数据库崩溃。那么如果是对一个小表做此操作会不会引起崩溃呢?这就是这次崩溃给我上的一课,让我觉得引起崩溃的原因并不是表的大小,而是表的访问量。
说到这个问题要先从数据库的锁机制说起。我们今天要说的锁是 MySQL 的表级锁的 MDL 锁。** 当对一个表做增删改查操作的时候,加 MDL
读锁; 当要对表做结构变更操作的时候,加 MDL 写锁。**
如上图所示:sessionA 发起 select 操作为表加一个 DML 的读锁,此时 sessionB 修改表结构,对表加一个 DML 写锁,因为 sessionA 的请求速度慢(或其他原因)导致读锁未释放,所以 sessionB 被阻塞进入 blocked 状态。同时 sessionC 的 select 请求会因为 sessionB 的 blocked 而被阻塞。如果 sessionC 属于大量请求,再配合客户端的重连机制,就会导致大量超时的 sessionC 再请求,于是数据库的线程池就会爆满,从而引起崩溃。
正文完