解决并发冲突,我们可以用最简单的解决方案for update行锁数据库,也可以借助redis分布式锁。
但是悲观锁for update并发性太差了,高并发场景用户体验差,redis由成本比较大,要引用新的中间件,会有新的业务问题。那么我们可以尝试使用乐观锁。
乐观锁
其实就是数据表加一个版本号。更新的时候带上查询出来的版本号,比如
select id,version from table where id=1
获取到id为1,版本号为1,那么更新的时候就
update table set a=100 ,version=version+1 where id=1 and version=1
按上面的情况,如果在update之前有别的线程更新了,那么就找不到version=1了,那么这条更新结果将为0,没有记录可以更新,此时我们可以直接返回失败,前端提醒说当前访问人数过多,请稍后重试,也可以用while循环上面的代码逻辑,设置重试次数,也可以用spring的@Retryable
注解来进行重试。