Являются ли локальные классы, которые запрашиваются из базы данных, причиной состояния гонки?

#java #spring #hibernate #jpa

#java #spring #спящий режим #jpa

Вопрос:

 public class A { 
    String name = "foo";
}

@Service
public class B {
    
    private final Repository repo;
    
    public void someMethod(){
        A a = repo.findByName("foo");
        a.name = Thread.currentThread().getName();
        repo.save(a);
    }
}
  

Представьте, что 2 потока выполнили someMethod одновременно. Особенно в реализации гибернации jpa.

Мое мнение таково, что существует условие гонки.

Первый и второй потоки получают один и тот же объект с именем foo. Если я не ошибаюсь, без оптимистичной блокировки в этом сценарии будет ошибка.

Также оптимистичная блокировка вызывает исключение, поэтому мне нужно использовать пессимистическую блокировку для корректной работы?

Также, если я открою кэш второго уровня с распределенным в памяти кэшем (Redis, hazelcast), что произойдет?

Это проект IOT, и миллионы устройств вызывают этот API и сервис. Нужно ли мне подходить с возможной согласованностью?

Комментарии:

1. Вы используете терминологию многопоточности для описания транзакций базы данных, что сбивает с толку. Это не состояние гонки, это просто транзакция, которая может завершиться с ошибкой при оптимистичной блокировке. Затем вам нужно будет как-то с этим справиться (например, повторить неудачную транзакцию). Вы можете использовать пессимистическую блокировку, но возможно, что оптимистическая блокировка все же лучше, если транзакции не завершаются слишком часто.

2. Как насчет того, если я открою кэш второго уровня для кэширования запросов? Возможно ли снизить производительность запроса select? Но это часто меняется. Мне нужно реализовать кэш, который обрабатывает определенные функции. Также это архитектура микросервиса, поэтому я не могу действительно полагаться на общую транзакцию. Даже если я использую шаблон saga, чтобы контролировать транзакцию. Все еще слишком много дел :).

3. Я думаю, мне нужно выполнить нагрузочный тест. Я могу работать с Jmeter с облачными компьютерами. (Возможно, Aws или Azure)

4. Я думаю, может быть, возможно. Время покажет, это зависит от вас.