donz_ru

Пятничная загадка для компьютерщиков

Если всю политоту и «как нам обустроить Россию» под пиво уже обсудили, то вот ловите интересную и, главное, очень полезную тему.

Есть 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));
}

Если хочется перечислить и другие проблемы — велкам.

Error

default userpic

Your IP address will be recorded 

When you submit the form an invisible reCAPTCHA check will be performed.
You must follow the Privacy Policy and Google Terms of use.