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

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

答案:插入的过程一般都是分两步的:先判断是否存在记录,没有存在则插入否则不插入。如果存在并发操作,那么同时进行了第一步,然后大家都发现没有记录,最后在第二步的时候都插入了数据从而造成数据的重复。下面场景,假设同时有三个线程-线程a、线程b、线程c,同时进行插入操作,需要执行如下几个步骤:

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

标签: none

添加新评论