MyBatis常见面试题3:数据库插入重复如何处理

380人浏览 / 0人评论

备注:本文修订于2021年1月25日,其主要思路是将redis当锁来使用。

问题:

在开发过程中,经常遇到插入重复的现象,这种情况该如何解决呢?

答案:

插入的过程一般都是分两步的:先判断是否存在记录,没有存在则插入否则不插入。如果存在并发操作,那么同时进行了第一步,然后大家都发现没有记录,最后在第二步的时候都插入了数据从而造成数据的重复。解决插入重复的思路可以是这样的:

下面场景,假设同时有三个线程:线程a、线程b、线程c,进行插入操作。

(1)判断数据库是否有数据,有的话则无所作为。没有数据的话,则进行下面第2步。
(2)大家都要去竞争锁,用redis当锁,即:redis set key,其中只有一个操作a会成功,其他并发的线程b和c会失败的。
(3)上面set key 成功的线程a,开始执行插入数据操作,无论是否插入数据成功,都在最后del key。【注】插入不成功可以多尝试几次,增加成功的概率。
(4)如果拿到锁的线程a没有插入成功,即便是尝试了数次也没有插入成功,此时定是系统出现了bug,应该搞一个短信报警机制,让研发人员及时发现问题。

全部评论

晴天下起了小雨
2017-10-01 18:00
很喜欢,果断关注了
wjmyly7336064
2017-10-01 18:00
相当实用,赞美了
橘大佬
2017-10-01 18:00
就是有些细节再到位点就好了…