关于MySQL插入更新的一些思考(2019-09

2019-09-24 07:39 | 达峰网
今天在和前端联调过程中,对于工单的处罚的业务逻辑做了一些补充,由于每个工单只能处罚一次,但是所以的人都可以新增处罚, 也就是说存在竞争的情况,正常的情况下,当有人新增成功后,已经提交处罚的请求应该归属失败。

为了保证数据的唯一性,在最开始我将工单编号设置为unique,使用ON DUPLICATE KEY UPDATE方法来避免重复数据。采用这种方式的原因是:我本人认为这是一种可以作为解决并发重复插入问题的方案,但是实际上,该方案并不适用并发的情况,原因如下:insert ... on duplicate key 在执行时,innodb引擎会先判断插入的行是否产生重复key错误,

如果存在,在对该现有的行加上S(共享锁)锁,如果返回该行数据给mysql,然后mysql执行完duplicate后的update操作,然后对该记录加上X(排他锁),

最后进行update写入。

如果有并发事务执行同样的语句,那么就可能会产生死锁。

所以最终加上一段逻辑来弥补这个缺陷,使用Redis的分布式锁,做插入更新前获取该工单编号的锁,以此来保证insert ... on duplicate key不会并发执行。
热门文章
图文推荐
最新推荐
编辑邮箱:fa4838731@gmail.com | xml地图 | 达峰网移动端
郑重声明:达峰网网站资源摘自互联网,如有侵权,麻烦通知删除,谢谢!