2

Сделка не работает при использовании spring4 @Transactional и jdbctemplate !! Пожалуйста, помогите мнеСделка не работает при использовании spring4 @Transactional

application.xml

<context:component-scan base-package="com.test" /> 

<bean id="txtManager" 
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

<bean class="org.springframework.jdbc.core.JdbcTemplate"> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

<tx:annotation-driven transaction-manager="txtManager" proxy-target-class="true"/> 

ява код

package com.test; 

@Component 

public class TService { 

@Autowired JdbcTemplate jdbcTemplate; 

@Transactional(rollbackFor = Exception.class) 
public void tt() throws Exception{ 

     jdbcTemplate.update("insert into t_test values(1)"); 
     jdbcTemplate.update("insert into t_test(dd) values(1)"); 

    } 

} 

код контроллера

@Controller("") 
public class Tcontroller { 

    @Autowired TService ts; 

    @RequestMapping(value = "/test", method = RequestMethod.GET) 
    public @ResponseBody Object all() throws Exception { 
     ts.tt(); 
     return ""; 
    } 

} 

ЦГ() бросить исключение, но сделка отката назад!

сегодня, я нашел это

[DEBUG] 23:36:19,729 org.springframework.aop.framework.CglibAopProxy (accept:833) - Unable to apply any optimisations to advised method: public void com.test.TService.tt() throws java.lang.Exception 
[DEBUG] 23:36:19,729 org.springframework.aop.framework.CglibAopProxy (accept:797) - Found 'equals' method: public boolean java.lang.Object.equals(java.lang.Object) 
[DEBUG] 23:36:19,729 org.springframework.aop.framework.CglibAopProxy (accept:833) - Unable to apply any optimisations to advised method: public java.lang.String java.lang.Object.toString() 
[DEBUG] 23:36:19,729 org.springframework.aop.framework.CglibAopProxy (accept:802) - Found 'hashCode' method: public native int java.lang.Object.hashCode() 
[DEBUG] 23:36:19,729 org.springframework.aop.framework.CglibAopProxy (accept:833) - Unable to apply any optimisations to advised method: protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException 
[DEBUG] 23:36:19,729 org.springframework.aop.framework.CglibAopProxy (accept:791) - Method is declared on Advised interface: public abstract int org.springframework.aop.framework.Advised.indexOf(org.springframework.aop.Advisor) 
[DEBUG] 23:36:19,729 org.springframework.aop.framework.CglibAopProxy (accept:791) - Method is declared on Advised interface: public abstract int org.springframework.aop.framework.Advised.indexOf(org.aopalliance.aop.Advice) 

прокси создать не получится?

+0

Адрес, где вы вызываете метод tt(). Показать пример –

+0

См. Http://stackoverflow.com/a/21188820/1199132 –

+1

Позвольте мне угадать, что у вас также есть 'DispatcherServlet', который имеет другой файл конфигурации, который также содержит базовый пакет' '... –

ответ

0

Сделка всегда откат, если она встречает исключенное исключение во время выполнения. Ваша проблема, вероятно, вызвана тем, что вы поймали исключение, а затем повторно выбросите его. Это совершенно необязательно делать.

Раздел 16.5.3: В конфигурации по умолчанию код транзакционной инфраструктуры Spring Framework, только помечает транзакцию для отката в случае от выполнения, непроверенные исключения; то есть, когда выбрано исключение является экземпляром или подклассом RuntimeException. (Ошибки будут также - по умолчанию - результат откат). Проверенные исключения, которые были вызваны транзакционным методом , не приводят к откату в конфигурации по умолчанию.

Прочитано official doc.

+0

Благодарим вас за ответ, я попробовал –

+0

Просто прочитал ваш отредактированный вопрос. Во-первых, ваш метод dao вызывает исключение java.lang.Exception, но ваш код не выбрасывает исключенное исключение, равно как и jdbcTemplate. Зачем заявлять об этом? Во-вторых, зачем добавить rollbackFor = Exception.class? Если единственным исключением в этом методе является исключение RuntimeException, нет необходимости добавлять это. Уберите оба лишних заявления и повторите попытку. Это сделает ваш код намного чище и, надеюсь, даст вам откат, который вы хотели. –

0

У меня такая же проблема, когда я бросал нуль при испытаниях. Похоже, что @Transaction работает только с экземпляром или подклассом RuntimeException.

Какое исключение нет. enter image description here