业务:
创建卡片, 业务要求,同一个客户,在任何时候不能创建两张相同类型的卡.正常情况下 是有检查是否有相同的卡片的数据的,如果有就直接打回.
而且接口家里分布式锁, 在锁有效期内会被拦截.
问题:
因为慢sql,导致数据库服务器被卡主了,很多sql在数据库段被阻塞了,排着队很久才被执行完成.因此该检查导数据的没检查到,导致重复插入数据.
模拟问题:
第一笔请求,redis加锁3分钟,数据库卡6分钟才提交事务.
在3分钟后,锁失效后重新发第二笔请求,能够获取锁,继续往下走,检查数据库没数据(数据库还卡着),继续走开卡流程..6分钟后数据库恢复,第一笔请求成功写入数据库,接着第二笔的也写入数据库,造成两笔数据成功写入.
如上所述, 如何解决.
现阶段考虑以下办法解决之:
由于考虑应用后期允许:同一个客户允许创建多张相同类型的卡片.所以不考虑用业务主键来做排斥.
目前想到的办法是 redis加锁时间延长到30分钟,业务允许这样控制. 数据库经过优化应该极少出现sql被阻塞这么久的现象.