Spring управление транзакциями
Я работаю над Spring4 mvc, чтобы представить его в нашем новом веб-приложении, и в настоящее время мы используем struts1.x и хотели использовать новую инфраструктуру для поддержки запроса html5/ajax настолько просто, насколько это возможно, и хотели использовать возможности DI и Spring Webflow.
В настоящее время в нашем приложении struts1.x управление транзакциями БД выполняется в нашем пользовательском GenericAction, который является подклассом Action. В GenericAction мы получаем соединение из источника данных и передачу обслуживания подклассам, затем любое исключение, которое вызывается, затем перехватывается и выполняется откат, в противном случае фиксируется так, Атомность базы данных (управление транзакциями) осуществляется в одном месте. Все классы действий модуля должны расширять GenericAction так, чтобы соединение с базой данных было доступно, и выполнять связанные с модулем вещи, а после завершения соединения будет либо откат, либо принятие в GenericAction, как сказано выше.
Весной область действия Транзакции начинается с аннотации @Transactional, а затем заканчивается методом в классе обслуживания, поскольку класс обслуживания помечается как @Transactional. Это нереальное решение для меня. Я прочитал несколько документов, связанных с весенней сделкой, прежде чем начать, и ниже приведены мои вопросы. Я использую HibernateTransactionManager в качестве менеджера транзакций
Транзакция должна начинаться с перехватчиков в случае веб-запроса или любого класса (в случае модульного тестирования).
Транзакция должна заканчиваться выполнением перехватчика после веб-запроса или любого класса в случае модульного тестирования.
В случае возникновения какого-либо исключения, тогда наш обработчик HandlerExceptionResolverImpl будет выполнен, тогда соединение должно быть откатом.
Любой обходной путь или лучшие практики будут очень признательны.
Спасибо Доррайраадж
2 ответа
На мой взгляд, вы можете добиться этого с минимальными изменениями в текущем приложении, следуя тому, что Spring делает в org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(Object, TransactionDefinition). Подробно, я думаю, что что-то вроде следующего должно работать:
- На GenericAction получите соединение из источника данных (как вы уже сделали)
- Свяжите соединение через его владельца с текущим источником данных: TransactionSynchronizationManager.bindResource(getDataSource(), txObject.getConnectionHolder());
- В конце концов, зафиксируйте транзакцию как org.springframework.jdbc.datasource.DataSourceTransactionManager.doCommit(DefaultTransactionStatus).
В любом случае http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/transaction/support/TransactionTemplate.html Spring может помочь в реализации любого программного сценария транзакций, который вы захотите. Просто нужно убедиться, что нужный транзакционный ресурс привязан к открывающей транзакции.
Надеюсь это поможет.
Спасибо за ответ. Ваш пост / предложение побуждает сделать следующее
Я написал перехватчик с именем TxtManager, и ниже приведены методы для управления транзакциями.
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception
{
Session session = sessionFactory.openSession();
SessionHolder hold = new SessionHolder(
session);
TransactionSynchronizationManager.bindResource(sessionFactory, hold);
// passing null would accept the default transaction definition.
status = transactionManager.getTransaction(null);
return true;
}
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception
{
Exception hanlderEx = (Exception) request
.getAttribute(HandlerExceptionResolverImpl.EXCEPTION_KEY);
if (hanlderEx != null)
{
transactionManager.rollback(status);
}
else
{
transactionManager.commit(status);
}
}
В классе HandlerExceptionResolverImpl, который отвечает за обработку событий при исключении, помещает объект исключения в запрос и читает то же исключение для отката или фиксации в методе afterCompletion перехватчика.
В промежутке (preHandler и afterCompletion) мы будем использовать стандартные методы для выполнения связанных с модулем вещей, включая любые другие перехватчики. Модульное тестирование может не поддерживаться, я проверю другую альтернативу для модульного тестирования.
Наконец, мы смогли смоделировать существующую каркасную работу с вашим предложением. Спасибо
Любое предложение по улучшению этого было бы очень признательно!!..
Спасибо Доррайраадж