记一个读写锁引起的数据库崩溃

记一个读写锁引起的数据库崩溃

我们应该都有意思:对一个大表做修改表结构操作可能会引起数据库崩溃。那么如果是对一个小表做此操作会不会引起崩溃呢?这就是这次崩溃给我上的一课,让我觉得引起崩溃的原因并不是表的大小,而是表的访问量。
说到这个问题要先从数据库的锁机制说起。我们今天要说的锁是MySQL的表级锁的MDL锁。**当对一个表做增删改查操作的时候,加 MDL
读锁;当要对表做结构变更操作的时候,加 MDL 写锁。**

记一个读写锁引起的数据库崩溃

如上图所示:sessionA发起select操作为表加一个DML的读锁,此时sessionB修改表结构,对表加一个DML写锁,因为sessionA的请求速度慢(或其他原因)导致读锁未释放,所以sessionB被阻塞进入blocked状态。同时sessionC的select请求会因为sessionB的blocked而被阻塞。如果sessionC属于大量请求,再配合客户端的重连机制,就会导致大量超时的sessionC再请求,于是数据库的线程池就会爆满,从而引起崩溃。