繁体   English   中英

使用 spring4 @Transactional 时事务不起作用

[英]Transaction not work when use spring4 @Transactional

使用 spring4 @Transactional 和 jdbctemplate 时事务不起作用!! 请帮我

应用程序.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 "";
    }

}

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)

代理创建失败?

当我在测试中抛出 null 时,我遇到了同样的问题。 似乎 @Transaction 仅适用于 RuntimeException 的实例或子类。

哪个例外不是。 在此处输入图片说明

如果遇到未经检查的运行时异常,事务总是会回滚。 您的问题可能是由于您捕获了异常然后重新抛出它的事实引起的。 做这样的事情是完全没有必要的。

第 16.5.3 节:在其默认配置中,Spring Framework 的事务基础结构代码仅在运行时、未检查异常的情况下将事务标记为回滚; 也就是说,当抛出的异常是 RuntimeException 的实例或子类时。 (错误也会 - 默认情况下 - 导致回滚)。 从事务方法抛出的已检查异常不会导致默认配置中的回滚。

阅读官方文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM