mysql update 引发很隐蔽的死锁问题

场景:

mysql当使用InnoDB,update语句的where条件没有使用主键索引(聚簇索引),而是使用非主键索引时,会先锁住当前非主键索引,然后再尝试获取主键索引;  如果事务一: 已经获取id =1 这一行的主键索引和 id = 2这一行的非主键索引; 事务二:  已经获取id =2 这一行的主键索引, id = 1这一行的非主键索引。两个事务出现相互等待的循环,也就是死锁。


死锁场景

解决方式:

update的时候,先select出所有需要更新的记录,然后再update,where只采用主键做条件。所有update语句将会只锁住主键索引,而不会尝试锁非主键索引。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 索引 数据库中的查询操作非常普遍,索引就是提升查找速度的一种手段 索引的类型 从数据结构角度分 1.B+索引:传统...
    一凡呀阅读 3,035评论 0 8
  • 一、MySQL优化 MySQL优化从哪些方面入手: (1)存储层(数据) 构建良好的数据结构。可以大大的提升我们S...
    宠辱不惊丶岁月静好阅读 2,500评论 1 8
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,453评论 0 9
  • 每一个小旮旯,都是世界的缩影。 看了戏影师哥师姐的毕业设计,主题叫做“旮旯”。每一位设计者都在自己的作品中创设了一...
    海藻姑娘阅读 430评论 0 1
  • 1. 在衡山做义工的时候认识的一个很可爱的小妹妹。 最近两天生病了。跟我借医药费。 一开始也没有当回事。就想着生病...
    玄微阅读 265评论 0 0