2014-01-02 6 views
0

У меня есть система пакетной обработки, которая объединяет количество успешных результатов. Многие серверы выполняют агрегацию, одновременно обновляя одну строку в таблице. Я выполнение подготовленных заявлений, используя спящим режим, как этоПессимистическая блокировка с подготовленным спящим статусом

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(); 

Были некоторые проблемы параллелизма и решили использовать пессимистическую блокировку, поскольку вероятность столкновения довольно высота. Как выполнить пессимистическую блокировку при использовании готовых операторов, подобных этому в спящем режиме.

+0

Вы делаете это через собственный SQL, а не через Hibernate, так что это вам не поможет. Если вы выполняете запрос в транзакции, сначала выполняйте 'SELECT ... FOR UPDATE', который будет блокироваться по вашему желанию. –

+0

@BoristheSpider выше выполняется в самой транзакции. По выбору ... для обновления u означает сначала получить объект, а затем выполнить обновление? Если я сделаю выбор ... для обновления не два запроса, которые попадают в db (1 для select & 1 для обновления) вместо 1 в этом случае? – zolo

ответ

1

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

Опять же, если это пакетное обновление, лучше не иметь высокий уровень изоляции. Вы можете рассмотреть возможность обработки пакетных технологий, таких как Spring Batch.

1

Вы не указали установку уровня изоляции ваших транзакций. Вы пробовали его установку, используя нечто вроде @Transactional (изоляции = Isolation.SERIALIZABLE, распространение = Propagation.REQUIRED)

В противном случае, Hibernate методов блокировки сеанса работы на объекты и не относятся к SQL DDL,.

Смежные вопросы