polo1_boy 2021-10-12 17:16 采纳率: 0%
浏览 22

mysql数据库阻塞导致重复数据

业务:
创建卡片, 业务要求,同一个客户,在任何时候不能创建两张相同类型的卡.正常情况下 是有检查是否有相同的卡片的数据的,如果有就直接打回.
而且接口家里分布式锁, 在锁有效期内会被拦截.

问题:
因为慢sql,导致数据库服务器被卡主了,很多sql在数据库段被阻塞了,排着队很久才被执行完成.因此该检查导数据的没检查到,导致重复插入数据.

模拟问题:
第一笔请求,redis加锁3分钟,数据库卡6分钟才提交事务.
在3分钟后,锁失效后重新发第二笔请求,能够获取锁,继续往下走,检查数据库没数据(数据库还卡着),继续走开卡流程..6分钟后数据库恢复,第一笔请求成功写入数据库,接着第二笔的也写入数据库,造成两笔数据成功写入.

如上所述, 如何解决.

现阶段考虑以下办法解决之:
由于考虑应用后期允许:同一个客户允许创建多张相同类型的卡片.所以不考虑用业务主键来做排斥.

目前想到的办法是 redis加锁时间延长到30分钟,业务允许这样控制. 数据库经过优化应该极少出现sql被阻塞这么久的现象.

  • 写回答

2条回答 默认 最新

  • 於黾 2021-10-12 17:20
    关注

    这办法多了,重点在于不要在客户端做校验
    1.启用数据库事务
    2.联合主键,让用户和卡类型不能都一样(这个最简单了)

    评论

报告相同问题?

问题事件

  • 创建了问题 10月12日

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?