记一次神奇的MySQL死锁排查
发布时间:2019-03-22 06:30:17 所属栏目:建站 来源:咖啡拿铁
导读:副标题#e# 背景 说起Mysql死锁,之前写过一次有关Mysql加锁的基本介绍,对于一些基本的Mysql锁或者死锁都有一个简单的认识,可以看下这篇文章为什么开发人员需要了解数据库锁。有了上面的经验之后,本以为对于死锁都能手到擒来,没想到再一个阳光明媚的下午
这段代码的意思是保存一个配置文件,,如果发生了唯一索引冲突那么就会进行更新,当然这里可能写得不是很规范,其实可以用
也可以达到同样的效果,但是就算用这个其实也会发生死锁。看了代码之后同事又给我发了当时业务日志, 可以看见这里有三条同时发生的日志,说明都发生了唯一索引冲突进入了更新的语句,然后发生的死锁。到这里答案终于稍微有点眉目了。 这个时候再看我们的表结构如下(做了简化处理):
我们的tenant_id是用来做唯一索引,我们的插入和更新的where条件都是基于唯一索引来操作的。
到了这里感觉插入的时候对唯一索引加锁有关系,接下来我们进行下一步的深入剖析。 深入剖析 上面我们说有三个事务进入update语句,为了简化说明这里我们只需要两个事务同时进入update语句即可,下面的表格展示了我们整个的发生过程: 小提示:S锁是共享锁,X锁是互斥锁。一般来说X锁和S,X锁都互斥,S锁和S锁不互斥。 (编辑:成都站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |