文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

高并发状态下Replace Into造成的死锁问题解决

2023-01-18 10:30

关注

1.问题出现:

在测试阶段,大数据并发的情况下,发现sql语句造成表的死锁,过一段时间,死锁消失。于是进行排查

报错如下:

高并发状态下Replace Into造成的死锁问题解决

对应的sql语句如下:

    @Insert("replace into ${tableName}( windcode,date, \n" +
            "      code, high, open, low, \n" +
            "      `close`, volume, turnover,gtm_modify) "
            + "values (#{obj.windcode},#{obj.date},#{obj.code},#{obj.high},#{obj.open},#{obj.low},#{obj.close},#{obj.volume},#{obj.turnover},#{obj.updateTime})" )
    int insertOne(@Param("obj") KDTO obj, @Param("tableName") String tableName);

在排除了数据问题和线程重复调用以后,我们关注了一下sql语句本身。 看了网上很多经验分享,觉得问题可能出现在 Replace Into 语句上。

2.分析解决

首先我们分析一下为什么并发replace into导致mysql死锁

Replace into 一般作用是,当存在冲突时,会把旧记录替换成新的记录。也就是说这条语句执行,分为了两个大步:判断和执行

1.判断:

首先判断我们需要操作的记录是否存在(根据主键或者唯一索引判断

2.操作:

测试:

建立表

高并发状态下Replace Into造成的死锁问题解决

插入数据:

高并发状态下Replace Into造成的死锁问题解决

我们使用replace into语句去执行一个已经存在的数据:

高并发状态下Replace Into造成的死锁问题解决

可以清楚的发现,影响的行数是两行

高并发状态下Replace Into造成的死锁问题解决

第一行的数据被修改了

高并发状态下Replace Into造成的死锁问题解决

我们使用replace into语句去执行一个不存在的数据:

高并发状态下Replace Into造成的死锁问题解决

可以清楚的发现,影响的行数是一行

高并发状态下Replace Into造成的死锁问题解决

执行了插入操作:

高并发状态下Replace Into造成的死锁问题解决

逻辑非常的清晰,但是这种单条sql语句在什么情况下会出现死锁呢?我们就要去考虑这个加锁的时机。

正常的插入逻辑是:

发现错误:

转换模式:

如果发生uk冲突的索引是最后一个唯一索引、没有外键引用、且不存在delete trigger时,使用UPDATE ROW的方式来解决冲突;
否则,使用DELETE ROW + INSERT ROW的方式解决冲突。

更新记录:

所以死锁的问题多半就会出现在X记录锁上面。

死锁分析:

所以再多线程高并发的环境状态下,存在两个事务同时去获取一个记录的修改的情况:

事务1事务2
LOCK_X LOCK_NOT_GAP-
-LOCK_X-LOCK_NEXT_KEY 阻塞
LOCK_S-LOCK_NEXT_KEY死锁回滚

 所以在等待执行期间sql会有死锁报错,高并发环境下的死锁也就出现了,再事务执行完成回滚操作以后,死锁回滚,也就解释了死锁消失的问题。

3.解决方案:

经过多方讨论,最终决定使用 insetr + ON DUPLICATE KEY UPDATE语句替换高并发环境下的Replace Into语句解决死锁问题。

ON DUPLICATE KEY UPDATE语句的作用是:

若该数据的主键值/ UNIQUE KEY 已经在表中存在,则执行更新操作, 即UPDATE 后面的操作。

否则插入一条新的记录。

实现了Replace Into有相同的查重替换功能,而避免了高并发的死锁问题。

但是UPDATE操作性能相比DELETE操作会有一定的性能上的影响,需要后续测试跟进。

到此这篇关于高并发状态下Replace Into造成的死锁问题解决的文章就介绍到这了,更多相关Replace Into死锁内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯