2010-09-14 14 views
0

Я использую Spring 3.0.3.RELEASE вместе с mybatis-3.0.2 и mybatis-spring-1.0.0, работающими в Apache Tomcat 6.0.29 с JDK 1.6.0_21.Весеннее декларативное управление транзакциями не работает

Я создал класс DAO и класс обслуживания и определены следующие декларативного управления транзакциями -

<tx:advice id="txAdvice" transaction-manager="transactionManager"> 
     <tx:attributes> 
      <tx:method name="*" propagation="REQUIRED" /> 
     </tx:attributes> 
    </tx:advice> 
    <aop:config> 
     <aop:pointcut id="dtxops" 
      expression="execution(* com.project.service.*.*(..))" /> 
     <aop:advisor advice-ref="txAdvice" pointcut-ref="dtxops" /> 
    </aop:config> 
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource"> 
      <ref bean="dataSource" /> 
     </property> 
    </bean> 

Этот метод находится в классе com.project.service.ItemDAOServiceImpl, который использует ItemDAO. SystemException - это исключение RunTimeException. Я передаю 2 идентификатора для удаления, один идентификатор существует в системе, а другой нет. Поскольку один id не существует, я получаю SystemException, но когда я проверяю базу данных, другой идентификатор удаляется вместо отката.

public void deleteItem(List<Integer> itemIds) { 
     for (int itemId : itemIds) { 
      try { 
       int result = itemDAO.delete(itemId); 
       if (result != 1) { 
        throw new SystemException(
          "Failed to delete item"); 
       } 
      } catch (DataAccessException dae) { 
       log.error("Failed to delete item", dae); 
       throw new SystemException("Failed to delete items"); 
      } 
     } 
    } 

ответ

2

Конфигурация транзакции находится вокруг объекта Dao справа? Таким образом, каждый вызов itemDAO.delete является отдельной транзакцией. Поэтому, если первый идентификатор найден, он удаляется в одном txn. Для второго, который он не найдет, исключение выбрасывается за пределы txn - no rollback.

Похоже, вам нужно настроить txn на метод deleteItem.

+0

Кроме того, я бы рекомендовал аннотации Spring для такого рода вещей. Легко видеть, где границы транзакций, без вывода, где применяются pointcut и не применяются. –

0

Остерегайтесь автоматической фиксации Tomcats для источников данных, которые фиксируются после каждого утверждения. Для меня это звучит немного похоже. Я столкнулся с этой проблемой один раз, а не весело ...