场景:
多线程执行如下操作:根据用户名查询用户积分,如果积分表没有记录,插入一条初始记录,有则更新。
问题:
并发情况下会出现多个线程都没有发现记录,结果一个用户名插入了多条初始记录。
这种情况有什么好的解决方案吗
如果是SQL数据库,
1.使用事务,在新增用户时,同时初始化积分数据。
2.使用事务,更新积分记录
如果是NoSQL数据库,将用户和积分放到一个聚合中,可保证操作的原子性。
现在用的是sql。
嗯,其实最好的实现方式就是有个单线程做初始化的工作。
只不过现在情况,这部分代码跟用户那个系统还不是一个系统。 也就是积分是我这边单独管理的, 而计算积分的源数据是从别的地方发来的。 现在一些东西还没确定,乱糟糟的。
我就是想不约定他们的情况下,我这边有没有用其它方式保证这个地方的线程安全。
在处理这个行为的地方加一把锁,这样每次仅有一个线程可以访问这一块。
这种不行,加锁没意义啊,我加锁就没多线程了,其它不是初始化这条记录的代码也得等,
线程安全只能加锁,也就是线程同步