MySQL锁等待处理经验分享
我是本际云服务器推荐网的小编小本本,今天给大家带来MySQL锁等待处理经验分享。最近业务侧反馈,系统MySQL数据库锁等待比较严重,经过分析可知,锁等待主要在****.****表上。

表结构信息查看
查看表结构后发现,该表有一个自增主键playlistid和唯一索引createuserid。
死锁产生原因分析
由innodbauto_increment的锁定模式设置为1,得知此模式下所有insert…select类语句针对自增主键会使用auto_inc表级锁,并保持到语句结束。同一时刻只有一个语句可以持有auto_inc锁。根据innodb状态信息得知,同时有多个事务并发对****这张表进行insert操作。事务1的insert操作会触发uniquekey的冲突检查进行一个当前读并加上X锁,等待持有自增主键的auto_inc锁。事务2的insert操作首先获得自增主键的auto_inc锁,此时为表级锁,等待持有对应记录的X锁(包含Gap锁)。此时事务1和事务2造成死锁,因为事务1的权重较小,MySQL选择回滚事务1。
根据经验,建议修改业务逻辑,将insert…select语句修改为insertingore或者replace的方式。同时,调整多个事务的执行顺序避免锁等待。
总之,在业务程序中一定要做好事务控制,事务结束时务必确保显示提交,释放持有的锁避免阻塞。程序中应尽量保证事务的原子性,一个事务实现一个逻辑,避免多个逻辑混合在一个事务中。
更多精彩干货分享,请关注IT那活儿。
原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/6084.html
