我想借助数据库获取序列号。这是我想要的:
1.从数据库中读取实体并锁定
2.增加序列号并更新实体。
我假设第一个线程可以锁定记录,而另一个线程在第一个线程提交其事务之前不会工作,但是,我得到了与我想要的相反的结果。
下面是我的代码:
存储库:
public interface ActivityNoGeneratorRepository extends BaseRepository<ActivityNoGenerator, Long> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query(value = "select generator from ActivityNoGenerator generator where id=:id")
ActivityNoGenerator getGeneratorByIdForUpdate(@Param("id") Long id);
}
Run Code Online (Sandbox Code Playgroud)
服务:
@Service
public class ActivityNoGeneratorServiceImpl implements IActivityNoGeneratorService {
@Autowired
private ActivityNoGeneratorRepository activityNoGeneratorRepository;
@Override
@Transactional
public String getActivityNo() {
ActivityNoGenerator activityNoGenerator = activityNoGeneratorRepository.getGeneratorByIdForUpdate(1L);
System.out.println(1);
Integer currentValue = activityNoGenerator.getCurrentValue() + 1;
if (!StringUtils.equals(DateFormatUtils.format(new Date(), "yyyyMM"), DateFormatUtils.format(activityNoGenerator.getLastAccessTime(), "yyyyMM"))) {
currentValue = 1;
}
String serialNum = String.format("%0" + activityNoGenerator.getWidth() + "d", currentValue);
String activityNo = …Run Code Online (Sandbox Code Playgroud)