2016-05-12 21 views
2

使用spring4時Transaction不起作用@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"/> 

Java代碼

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 ""; 
    } 

} 

的TT()拋出一個異常,但交易沒有回退!今天

,我發現這個

[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框架的事務 基礎設施代碼只在回退功能標記事務運行的 ,未檢查異常;也就是說,拋出的異常 是RuntimeException的一個實例或子類。 (錯誤也會 - 默認 - 導致回滾)。檢查從事務性方法拋出的異常 不會導致在默認 配置中回滾。

閱讀official doc

+0

感謝您的回覆,我試過 –

+0

只需閱讀您編輯的問題。首先,你的dao方法拋出一個java.lang.Exception,但你的代碼不會拋出任何檢查的異常,jdbcTemplate也不會拋出。爲什麼要申報?其次爲什麼添加rollbackFor = Exception.class?如果此方法中唯一可能的例外是RuntimeException,則不需要添加此方法。帶走兩個不必要的陳述,然後重試。它會讓你的代碼看起來更加乾淨,並希望給你所需的回滾。 –

0

當我在測試中拋出null時,我遇到了同樣的問題。它似乎是@Transaction僅適用於RuntimeException的實例或子類。

哪個例外不是。 enter image description here

相關問題