Весеннее декларативное управление транзакциями не работает - PullRequest
0 голосов
/ 14 сентября 2010

Я использую 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 и класс Service и определил следующее декларативное управление транзакциями -

<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 идентификатора для удаления, один идентификатор существует в системе, а другой нет. Поскольку один идентификатор не существует, я получаю исключение 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 ]

2 голосов
/ 16 сентября 2010

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

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

0 голосов
/ 16 декабря 2010

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

...