При использовании Spring и Hibernate, как обрабатываются сессии / транзакции? - PullRequest
2 голосов
/ 12 марта 2010

при использовании hibernate с пружиной, может кто-нибудь объяснить, как обрабатываются единица работы и транзакции сеанса?

  1. транзакция начинается в начале запроса страницы и фиксируется в конце?
  2. могу ли я иметь несколько вызовов в БД на запрос, каждый из которых имеет разные уровни транзакций? например некоторые остаются по умолчанию, а другие не читаются?

Ответы [ 3 ]

3 голосов
/ 13 марта 2010

транзакция начинается в начале запроса страницы и фиксируется в конце?

В веб-приложении открытие / закрытие Session - это , обычно , выполненное с использованием шаблона " Открыть сеанс в представлении ". Пружина поставляется с OpenSessionInViewFilter или OpenSessionInViewInterceptor для этого. Оба делают Hibernate Sessions доступным через текущий поток, который будет автоматически определяться менеджерами транзакций. Он подходит для транзакций уровня обслуживания через HibernateTransactionManager или JtaTransactionManager, а также для нетранзакционного выполнения (если настроено соответствующим образом).

Разграничение транзакций обычно выполняется на уровне методов обслуживания, используя Spring AOP, чтобы обернуть их внутри транзакций.

могу ли я иметь несколько вызовов БД на запрос, каждый из которых имеет разные уровни транзакций? например некоторые остаются по умолчанию, а другие не читаются?

Вы можете иметь вложенные транзакции с разными уровнями изоляции. См. Главу Управление транзакциями .

1 голос
/ 13 марта 2010

на ваши вопросы:

1 - транзакция, начатая в начало запроса страницы и совершено в конце?

Не совсем. обычный рабочий процесс пружины MVC:

requestDispatcher-> Controller-> Сервисный вызов (транзакция начинается и заканчивается здесь)

Сервисы могут вызывать Daos, Daos будет общаться с Datastore через Hibernate.

Транзакция может продолжать действовать после ответа http. например служба запущена в потоке.

2 - могу ли я иметь несколько вызовов в БД на просьба, чтобы у каждого были разные уровни транзакций? например некоторые остались по умолчанию, в то время как другие чтения незавершенных

Да, конечно, вы можете. скажем, ваше приложение выполняет миграцию. в запросе написано "начать миграцию!" Затем ваш сервис будет считывать данные через исходную базу данных, а также будет работать с логикой миграции, наконец, записать в целевую базу данных и совершить транзакцию.

1 голос
/ 12 марта 2010

Обычно он настраивается декларативно с аспектно-ориентированным программированием (AOP). Вы можете определить, для каких компонентов, классов, пакетов или методов требуются транзакции, и Spring предоставит их способом, аналогичным EJB. Благодаря АОП у вас есть полный контроль над тем, что именно и как входит в транзакции.

Подробнее об этом здесь: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#transaction-declarative

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