Многопоточные обновления с использованием Spring в спящем режиме - PullRequest
1 голос
/ 09 декабря 2011

Доброе утро, у меня есть столбец в таблице, который увеличивается в случае успеха. В моем слое обслуживания у меня есть

MyDomain myDomain = myDomainDAO.findById(myId);
myDomain.setValue(myDomain.getValue()+1); 
myDAO.saveorupdate(myDomain);

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

1 Ответ

1 голос
/ 10 декабря 2011

Вы можете прочитать об изоляции транзакций, это ключевая концепция транзакций, которую можно задавать на разных уровнях, насколько мне известно (вы можете установить ее в своей конфигурации db, на сервере приложений, а также в аннотациях Spring Transactionnal, но я нене знаю точно правила, чтобы гарантировать, какой уровень будет применяться).http://static.springsource.org/spring/docs/1.2.9/api/org/springframework/transaction/annotation/Isolation.html

Кстати, в параллельной среде, если вы просто хотите увеличить счетчик, вы должны знать, что изоляция транзакции влияет на производительность.Использование @Transactionnal (Isolation.SERIALIZABLE) обеспечит согласованность, но, возможно, это будет так же быстро, как установка синхронизированного блока в вашем методе увеличения дао ... Я не эксперт, разберитесь сами:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...