безопасность транзакций в спящем режиме (с JBoss, без)

В настоящее время я использую только Hibernate и tomcat (без JBoss), и у меня есть транзакции гибернации, которые я не понимаю, какой уровень безопасности транзакций я на самом деле использую, особенно для тех, которые читают и получают значения, а затем обновляют их). Таким образом, я могу плохо читать?

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

Нужно ли мне устанавливать Hibernate с JBoss для управления уровнями безопасности транзакций? Если да, то каков самый простой способ сделать это, не меняя мое приложение для использования API J2EE, поскольку в настоящее время я использую базовый API Hibernate. Или лучше, могу ли я получить управление JTA с помощью Hibernate без использования JBoss?

Энди


person Andy Nuss    schedule 11.01.2011    source источник


Ответы (2)


Вы явно помечаете свои транзакции em.getTransaction (). Begin () и commit ()? Если это так, Hibernate делегирует управление транзакциями драйверу JDBC, и вы можете настроить его с помощью других свойств (как на уровне драйвера, так и на уровне Hibernate, например, на уровнях изоляции).

Если вы затем решите использовать сервер приложений, вы можете просто установить для свойства hibernate.transaction.factory_class значение org.hibernate.transaction.JTATransactionFactory, и Hibernate присоединится / создаст транзакцию на основе ваших инструкций (em.getTransaction (). Begin ( ) / совершить()).

JTA особенно полезен, если у вас есть два или более компонента с "включенными транзакциями", поскольку JTA управляет событиями и заказывает коммиты / откаты в зависимости от общего результата. Например, если у вас есть одна транзакция EJB, которая сохраняет что-то в базе данных и отправляет электронное письмо, оба действия могут быть внутри транзакции, и ее можно откатить, если какое-либо из них не удастся. Но если вас интересуют только транзакции с базой данных, вам действительно не нужен JTA.

И чтобы ответить на ваш последний вопрос: если вам действительно нужен JTA, но вы не хотите использовать сервер приложений EE, вы можете поискать автономных поставщиков JTA, таких как JOTM. Но будьте осторожны: если вы обнаружите, что добавляете несколько «автономных» провайдеров для разных услуг, вы можете получить «домашний EE-сервер», что не очень хорошо ;-)

person jpkrohling    schedule 12.01.2011
comment
Я использую Hibernates begin и commit. Однако моя главная забота - предотвратить грязное чтение, и мне интересно, нужно ли мне вызывать session.flush () после изменения данных в bean-компоненте чтения, чтобы другая транзакция не увидела старое значение, когда оно собирается читать. Другими словами, у меня есть много транзакций, которые читают bean-компонент, изменяют его значение условно и ожидают, что другие транзакции, которые читают тот же bean-компонент, будут заблокированы до тех пор, пока данные не будут зафиксированы или откатятся. - person Andy Nuss; 15.01.2011

Это известно как уровни изоляции транзакции, и ниже приведен способ настроить их в спящем режиме

hibernate.connection.isolation - Установите уровень изоляции транзакции JDBC. Проверьте java.sql.Connection на предмет значимых значений, но обратите внимание, что большинство баз данных не поддерживают все уровни изоляции. например. 1, 2, 4, 8

person Aravind Yarram    schedule 12.01.2011