insert mysql 死锁_mysql insert死锁问题

以前一直不明白,为啥多个insert并发会导致deadlock问题,直到读了官方文档15.7.3 Locks Set by Different SQL Statements in InnoDB​dev.mysql.com

这里记录一下:update和delete都2一样的策略

insert比较不一样,需要重点说下

首先,insert会对要插入的gap加insert intention gap lock,insert intention gap lock不像gap lock一样防止insert,insert intention gap lock互相之间可以共存,这样允许多个insert并发插入不同的位置

其次,对于要插入的位置会加入排他锁

多个insert并发(至少3个),当插入的位置一样的时候,比如3个session都insert table id=x,其中第一个获得排他锁,其他两个session会产生duplicate-key error,当duplicate-key error发生时,两个session都会将锁变化为共享锁,下一步获取排他锁,然后第一个session rollback了,两个session互相持有共享锁,无法获得排他锁,导致死锁

s1 insert id =x 或者 s1 delete id = x

s2 insert id = x

s3 insert id = x

s1 rollback

5. replace和insert一样

6.

优化性能和死锁问题的思路:尽量将热点行的操作延后

控制并发度,加队列

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值