如何在不使用同步块的情况下处理这个java竞争条件?

1mrurvl1  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(268)

我用Spring Boot作为后端。考虑以下两个操作序列,它们可以由同一个用户从前端触发(在最坏的情况下):
答。减少产品数量(从前端)->更新数据库中的数量->从数据库读取检查产品数量是否低于最小值->如果是,在redis中添加记录
b。增加产品数量(从前端)->更新数据库中的数量->检查redis中是否有记录->如果有,从数据库中读取检查产品数量是否现在高于最小值->如果有,从redis中删除记录
我正在考虑这样一种情况:a后面跟b,b从redis读取,然后a在redis中添加记录。目前我正在考虑使用threadpool,其中任何进程(对于产品)都会检查池中是否存在以产品名称命名的线程,并相应地进行处理。这个问题有没有更好的解决办法?我没有使用同步块,因为它可能会成为一个瓶颈。

wtzytmuj

wtzytmuj1#

在常见的spring场景中,a和b将在不同的线程上执行,因此您不需要自己的线程池。因为您需要db和redis中的数据之间的一致性,所以需要某种编排。这通常是通过事务完成的,例如,请参见以下示例:https://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html
注:“更新数据库中的数量->从数据库读取,检查产品数量是否低于最小值”此额外读取不是必需的,因为您可以使用返回当前数据库值 UPDATE ... RETURNING

相关问题