Если всю политоту и «как нам обустроить Россию» под пиво уже обсудили, то вот ловите интересную и, главное, очень полезную тему.
Есть MySQL база, движок InnoDB. Через нее синхронизируется генерация уникальных ID собственного формата. Собственно, ява-метод ниже это и делает. Используется Spring Data JPA. На методе identifierRepository.findByTypeAndDatacenterId стоит аннотация @Lock(LockModeType.PESSIMISTIC_FORCE_INCREMENT). Сам метод identifierRepository.findByTypeAndDatacenterId - это просто объявление в интерфейсе, который наследуется от JpaRepository. То есть вся логика метода в его названии, как и завещает нам Spring Data JPA.
Внимание вопрос!
В чем самая хитрожопая ошибка этой реализации?
@Override
@Transactional(propagation = Propagation.MANDATORY)
public String generate(@NonNull IdentifierType type) {
var identifier = identifierRepository.findByTypeAndDatacenterId(type, config.getDatacenterId());
if (identifier == null) {
identifier = identifierRepository.save(Identifier.builder()
.type(type)
.datacenterId(config.getDatacenterId())
.build());
}
val id = String.format("%s%s%010d", type.getCode(), config.getDatacenterId(), identifier.getCounter());
return Optional.of(id).filter(it -> it.length() == 12).orElseThrow(() -> new RuntimeException("Error during id generation for: " + id));
}
Если хочется перечислить и другие проблемы - велкам.