Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Hibrenatе, паралельное сохранение


Автор: unkis 12.7.2012, 11:10
У меня следующая проблема.
Существует транзакция которая делает следующае

Транзакция:
1) Посмотри, есть ли обект с определёнными параметрами в БД.
2) Если нет, то создай этот объект. В противном случае обнови обект.

Предположим, мы имеем две транзакции (Т1 и Т2), которые выполняются параллельно.

T1 смотрит в БД - нет никакого объекта.
Миллисекунду позднее, T2 смотрит в БД - нет и объекта.

T1 сохраняет объект в базу данных, и это также делает T2.

У нас есть два объекта вместо одного.

Как ршить эту проблему?

Я использую: Hibernate + Tomcat + Spring

Спасибо.

Автор: AntonSaburov 12.7.2012, 11:22
Это вопрос к уровню изолированности транзакций - почитай http://ru.wikipedia.org/wiki/%D0%A3%D1%80%D0%BE%D0%B2%D0%B5%D0%BD%D1%8C_%D0%B8%D0%B7%D0%BE%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D1%82%D1%80%D0%B0%D0%BD%D0%B7%D0%B0%D0%BA%D1%86%D0%B8%D0%B9

Мы обчно решали этот вопрос с помощью версионности - например http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/transactions.html#transactions-optimistic

Автор: unkis 12.7.2012, 11:39
На самом деле, проблему решил простым словом synchronyzed в вызове методо, помоему быстрое и оптимальное решение, что думаете?

Автор: AntonSaburov 12.7.2012, 15:44
Я не совсем внимательно прочитал первое сообщение - чего-то в версионность полез.
Может будет проще поставить уникальность на список нужных полей в базе данных - если такой объект существует, то при добавлении будет выдаваться exception. И всех делов.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)