У меня есть система пакетной обработки, которая объединяет количество успешных результатов. Многие серверы выполняют агрегацию, одновременно обновляя одну строку в таблице. Я выполнение подготовленных заявлений, используя спящим режим, как этоПессимистическая блокировка с подготовленным спящим статусом
SQL_UPDATE = "UPDATE STATS.COUNTS SET SUCCESSCOUNT = SUCCESSCOUNT + ? WHERE ID = ?"
update = session.connection().prepareStatement(SQL_UPDATE);
update.setLong(1, data.getSuccessCount());
update.setLong(2, data.getBatchId());
update.execute();
Были некоторые проблемы параллелизма и решили использовать пессимистическую блокировку, поскольку вероятность столкновения довольно высота. Как выполнить пессимистическую блокировку при использовании готовых операторов, подобных этому в спящем режиме.
Вы делаете это через собственный SQL, а не через Hibernate, так что это вам не поможет. Если вы выполняете запрос в транзакции, сначала выполняйте 'SELECT ... FOR UPDATE', который будет блокироваться по вашему желанию. –
@BoristheSpider выше выполняется в самой транзакции. По выбору ... для обновления u означает сначала получить объект, а затем выполнить обновление? Если я сделаю выбор ... для обновления не два запроса, которые попадают в db (1 для select & 1 для обновления) вместо 1 в этом случае? – zolo