Spring управление транзакциями

Я работаю над Spring4 mvc, чтобы представить его в нашем новом веб-приложении, и в настоящее время мы используем struts1.x и хотели использовать новую инфраструктуру для поддержки запроса html5/ajax настолько просто, насколько это возможно, и хотели использовать возможности DI и Spring Webflow.

В настоящее время в нашем приложении struts1.x управление транзакциями БД выполняется в нашем пользовательском GenericAction, который является подклассом Action. В GenericAction мы получаем соединение из источника данных и передачу обслуживания подклассам, затем любое исключение, которое вызывается, затем перехватывается и выполняется откат, в противном случае фиксируется так, Атомность базы данных (управление транзакциями) осуществляется в одном месте. Все классы действий модуля должны расширять GenericAction так, чтобы соединение с базой данных было доступно, и выполнять связанные с модулем вещи, а после завершения соединения будет либо откат, либо принятие в GenericAction, как сказано выше.

Весной область действия Транзакции начинается с аннотации @Transactional, а затем заканчивается методом в классе обслуживания, поскольку класс обслуживания помечается как @Transactional. Это нереальное решение для меня. Я прочитал несколько документов, связанных с весенней сделкой, прежде чем начать, и ниже приведены мои вопросы. Я использую HibernateTransactionManager в качестве менеджера транзакций

  1. Транзакция должна начинаться с перехватчиков в случае веб-запроса или любого класса (в случае модульного тестирования).

  2. Транзакция должна заканчиваться выполнением перехватчика после веб-запроса или любого класса в случае модульного тестирования.

  3. В случае возникновения какого-либо исключения, тогда наш обработчик HandlerExceptionResolverImpl будет выполнен, тогда соединение должно быть откатом.

Любой обходной путь или лучшие практики будут очень признательны.

Спасибо Доррайраадж

2 ответа

Решение

На мой взгляд, вы можете добиться этого с минимальными изменениями в текущем приложении, следуя тому, что Spring делает в org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(Object, TransactionDefinition). Подробно, я думаю, что что-то вроде следующего должно работать:

  1. На GenericAction получите соединение из источника данных (как вы уже сделали)
  2. Свяжите соединение через его владельца с текущим источником данных: TransactionSynchronizationManager.bindResource(getDataSource(), txObject.getConnectionHolder());
  3. В конце концов, зафиксируйте транзакцию как 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) мы будем использовать стандартные методы для выполнения связанных с модулем вещей, включая любые другие перехватчики. Модульное тестирование может не поддерживаться, я проверю другую альтернативу для модульного тестирования.

Наконец, мы смогли смоделировать существующую каркасную работу с вашим предложением. Спасибо

Любое предложение по улучшению этого было бы очень признательно!!..

Спасибо Доррайраадж

Другие вопросы по тегам